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

And*_*ers 8 asp.net viewstate controls dynamic telerik

我目前正在为几个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);
}
Run Code Online (Sandbox Code Playgroud)

我已经尝试了几个修复,例如向wuc添加不同的id,但这要么解除控制器的内部功能,如处理程序等,要么生成相同的viewstate错误.

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

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

并且从Page_Load - > Page_Init移动生成了相同的错误.

错误:

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

Nik*_*hil 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);
    }
Run Code Online (Sandbox Code Playgroud)

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