我目前正在为多个Web项目开发动态核心。它具有使用树状 View 和菜单的核心。然后,对于每个特定项目,它将几个不同的wuc加载到maincontent中。一些业务项目使用与业务相关的wucs,而另一些业务项目则使用不同的wucs。因此,wuc的跨度确实很大。

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

但是我遇到一些viewstate错误,并且我已经观察了两天,没有一个解释的解决方案适用于我的项目。

我所有的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。但这禁用了我的第三方 Controller (Telerik)的脚本。

我也读过关于每个错字都有不同的PlaceHolders的信息,但是由于我希望最多导航50个不同的控件,所以我觉得这不会对我有所帮助。

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

错误:

最佳答案

对于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);
    }

希望这可以帮助。如果是这样,请选中此答案旁边的复选框以接受它,并根据需要投票:)

10-08 05:01