我目前正在为多个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);
}
希望这可以帮助。如果是这样,请选中此答案旁边的复选框以接受它,并根据需要投票:)