我遇到ViewState问题。我有一个aspx页面左侧有一个树视图,右侧有一个带有ASP.NET面板的UpdatePanel。它位于内部面板中,我可以动态加载和卸载用户控件。我使用该更新面板加载动态控件。
我还为我的用户控件创建了一个自定义控件,因为我需要从页面传递一些值。在该构造函数上,我使用ViewState来存储这些值。
第一次加载用户控件时,我使用参数调用其构造函数。当我在每个回发上重新加载该用户控件时,我使用它的普通构造函数。
我的问题是我在ViewState上存储的值在连续回发时变为null。
更新
这是我的用户控件:
public class MyUserControl : System.Web.UI.UserControl
{
private int PKId
{
get { return ViewState["pkId"] as int; }
set { ViewState["pkId"] = value; }
}
public MyUserControl(int pkId)
{
this.PKId = pkId;
}
...
}
我正在按照这篇文章动态加载控件:http://msdn.microsoft.com/en-us/magazine/cc748662.aspx#id0070065。
第二次更新:
当我第一次加载用户控件和每个原型时,我也设置了相同的控件ID。
也许我可以使用另一种方法来存储这些值,例如输入隐藏字段或缓存。我选择了ViewState,因为我不想为每个用户重载带有Session值的服务器。
第三次更新:
I load the controls with this code:
System.Web.UI.UserControl baseControl = LoadControl(ucUrl) as System.Web.UI.UserControl;
if (baseControl != null)
{
baseControl.ID = "DestinationUserControl";
PanelDestination.Controls.Add(baseControl);
}
使用此代码进行reaload:
DynamicControls.CreateDestination ud = this.LoadControl(TrackedUserControl) as DynamicControls.CreateDestination;
if (ud != null)
{
ud.ID = "DestinationUserControl";
PanelDestination.Controls.Add(ud);
}
发生了什么事?
答案 0 :(得分:3)
您何时加载用户控件?如果您希望保存/恢复ViewState,则必须在Init事件中执行此操作。
答案 1 :(得分:3)
在将控件添加到控件层次结构之前,尝试将控件存入加载/构建后将其存储到局部变量中。这允许ViewState数据从控件映射到控件。请参阅此处的“规则2”http://chiragrdarji.wordpress.com/2009/05/20/maintain-viewstate-for-dynamic-controls-across-the-postback/。
答案 2 :(得分:0)
在UpdatePanel内动态添加控件是个糟糕的主意。它产生了很多问题。
如果可能,请将动态控件创建移出UpdatePanel,我相信您的问题将得到解决。
答案 3 :(得分:0)
如上所述Bryan,您应该在Page_Init而不是Page_Load中加载动态控件。
正如this description of the Page Life Cycle所解释的那样,当Page_Load事件发生时,回发中的视图状态已经被处理(在PreLoad中)。如果尚未重新加载控件,则视图状态无处可去。
PreLoad:
如果您需要执行,请使用此事件 处理您的页面或控件 在加载事件之前。
在Page实例引发之前 event,它为自己加载视图状态 和所有控件,然后进程 包含的任何回发数据 请求实例。