无法加载视图状态。正在加载视图状态的控制树必须与用于保存视图状态的控制树匹配

Posted

技术标签:

【中文标题】无法加载视图状态。正在加载视图状态的控制树必须与用于保存视图状态的控制树匹配【英文标题】:Failed to load viewstate. The control tree into which viewstate is being loaded must match the control tree that was used to save viewstate 【发布时间】:2011-07-07 03:04:26 【问题描述】:

我目前正在为几个网络项目开发动态核心。它有一个使用树视图和菜单的核心。然后对于每个特定的项目,它将几个不同的 wuc 加载到一个主要内容中。一些商业项目使用与商业相关的 wuc,而另一些则使用不同的 wuc。所以wuc的跨度真的很大。

现在我的问题是,每当用户按下菜单项或树项时,它都会将 wuc 加载到链接到该对象的主要内容中。

但是我有一些视图状态错误,我已经四处寻找 2 天了,解释的解决方案都不适用于我的项目。

我所有的 wuc 都必须启用视图状态。

循环是->

Page(Control A) 使用变量回发以在 wucPanel(UpdatePanel) 中将控制更改为 ControlB。 OnLoad LoadRequested Wuc。

当前代码是

protected void Load_Page(object sender, EventArgs e)

//Code to decide which wuc to load.
 UserControl wucc = (UserControl)Page.LoadControl(sFilePath);        
 ParentControl.ContentTemplateContainer.Controls.Add(wucc);

我尝试了几种修复方法,例如向 wuc 添加不同的 id,但这要么会禁用处理程序等控件的内部功能,要么会产生相同的视图状态错误。

我找到的一个解决方案是加载 ControlA,然后将其删除,然后加载 ControlB。但这禁用了我的第 3 方控制器 (Telerik) 的脚本。

我也读过关于每个typof 有不同的PlaceHolders,但因为我希望有多达50 个不同的控件,所以我觉得这对我没有帮助。

从 Page_Load -> Page_Init 移动也会产生同样的错误。

错误:

加载视图状态失败。正在加载视图状态的控制树必须与在先前请求期间用于保存视图状态的控制树匹配。例如,动态添加控件时,在回发期间添加的控件必须与在初始请求期间添加的控件的类型和位置相匹配。

【问题讨论】:

【参考方案1】:

在您的情况下 Anders,您仍然需要在 init 方法中将旧控件与您现在要添加的新控件一起添加到您的页面。保留对您刚刚添加到类级别变量中的旧控件的引用。所以像

    Control _oldControl = null;
    protected void Init_Page(object sender, EventArgs e)
    
    //Code to decide which wuc to load.
     UserControl wucc = (UserControl)Page.LoadControl(sFilePath);        
     ParentControl.ContentTemplateContainer.Controls.Add(wucc);
     _oldControl = wucc as Control;
    //Now add the new control here.
    

   //override the LoadViewState method and remove the control from the control's collection     once you page's viewstate has been loaded 
    protected override void LoadViewState(object savedState)
    
            base.LoadViewState(savedState);
            ParentControl.ContentTemplateContainer.Controls.Remove(_oldControl);
    

希望这会有所帮助。如果是,请选中此答案旁边的复选框以接受它,如果您愿意,请投票:)

【讨论】:

我无法让系统进入我的覆盖方法,我不只是把它放在我的 aspx.cs 中吗?还是有其他步骤? 你说的是哪种覆盖方法?初始化页面还是 LoadViewState? 它只会在回发时被调用,而不是页面的初始加载。您能否验证它是否在回发时被调用? 虽然它不是我想要的那样,但我相信这是要走的路。仍然遇到 Telerik 错误,我必须以某种方式解决这些错误。谢谢您的帮助! 使用动态控件总是很棘手。实际上,我在动态添加/删除控件方面做了很多疯狂的工作。我发现这种方法是最好的方法。首先在 Init 上添加控件,然后在 LoadViewState 中跟踪它们。 Telerik 遇到什么错误?我也许能帮上忙。【参考方案2】:

为了避免与 ViewState 相关的错误,请绝对确保在 Page_Init 中创建的控件树与上一次保存 ViewState 时创建的控件树相同,即上一次回发。简单的页面生命周期:

Page Init - 创建控件树 - 在此处加载和应用视图状态

页面加载 - 已经加载的视图状态,您可以在此处对控件树进行修改 - 保存视图状态

页面预渲染

【讨论】:

问题是我不想在新的生命周期开始时显示相同的控件。由于用户已请求将新控件放置在旧控件所在的容器中(在 UpdatePanel 中)。 还想指出,我实施了以下博客中指出的解决方案:geekswithblogs.net/FrostRed/archive/2007/02/19/… 但它没有解决我的问题,不知何故我仍然收到此错误!【参考方案3】:

我最近遇到了同样的问题。

我的场景如下。

一个固定的过滤器面板(下拉列表和文本框),它构建了一个搜索 SQL 字符串。提交搜索后,结果会显示在下方的可编辑网格视图中。

在编辑 gridview 时,我有效地更改了数据库记录的状态,从而将其从先前选择的过滤器下的 gridview 中删除。在某些情况下,这会导致没有返回任何结果,从而导致我隐藏了 gridview。

然后我发现如果我在过滤器中使用记录的新状态并重新提交搜索,有时会发生错误。

我最终发现的问题与启用的视图状态等无关,而只是空的网格视图虽然不再可见(以编程方式更改),但没有被重新绑定到空数据源。

这似乎导致了冲突和错误。

因此,在我的情况下,视图状态问题似乎是由包含未刷新数据的不可见网格视图引起的。

【讨论】:

以上是关于无法加载视图状态。正在加载视图状态的控制树必须与用于保存视图状态的控制树匹配的主要内容,如果未能解决你的问题,请参考以下文章

无法在 NLB 上加载视图状态

如何在kendo树视图中重新加载或刷新整个分支(父级+子级)

使用 Firebase 和 Swift 3 检查用户登录状态并加载基于它的视图控制器

无法加载视图状态。仅在 IE 中发生错误

iOS:Tabbar - 加载选项卡的默认状态

更改初始视图后如何加载状态栏