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

时间:2011-03-02 09:09:38

标签: asp.net dynamic controls telerik viewstate

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

现在我的问题是,每当用户按下menuitem或treeitem时,它会将wuc加载到链接到该对象的maincontent。

但我有一些观点错误,而且我现在已经四处寻找,并且所解释的解决方案都没有适用于我的项目。

我所有的wuc都必须启用viewstate。

周期是 - >

页面(控件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,但是要么像处理程序那样取消控制的内部功能,要么生成相同的viewstate错误。

我找到的一个解决方案是加载ControlA然后只删除它然后加载ControlB。但这会禁用我的第三方控制器(Telerik)的脚本。

我也读过关于每种类型的不同PlaceHolders,但由于我希望有多达50种不同的控件,我觉得这不会对我有所帮助。

从Page_Load移动 - > Page_Init生成了相同的错误。

错误:

  

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

3 个答案:

答案 0 :(得分:5)

在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);
    }

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

答案 1 :(得分:2)

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

Page Init - 创建控制树 - 视图状态已加载并在此处应用

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

Page PreRender

答案 2 :(得分:2)

对于它的价值,我最近遇到了同样的问题。

我的情况如下。

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

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

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

我最终发现的问题与启用的视图状态等无关,但仅仅是空的gridview虽然不再可见(以编程方式更改),但还没有被反弹到空数据源。

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

因此,在我的情况下,视图状态问题似乎来自包含非刷新数据的不可见网格视图。