我有一个ViewState的问题。我有一个aspx页面,在左侧有一个treeview,右侧有一个带有ASP.NET Panel的UpdatePanel。在内部Panel中,我加载和卸载动态用户控件。我使用该更新面板来动态加载控件。
我还为我的用户控件制作了一个自定义控件,因为我需要从页面传递一些值。在构造函数中,我使用ViewState来存储这些值。
第一次加载用户控件时,我使用参数调用其构造函数。每次回发时重新加载该用户控件时,我使用它的普通构造函数。
我的问题是,我在连续的回发中存储在ViewState中的值已经变成了null。
更新:
这是我的一个用户控件的一部分:
我正在按照这篇文章动态加载控件:http://msdn.microsoft.com/en-us/magazine/cc748662.aspx#id0070065。
第二次更新:
当我首次加载用户控件并在每次重新加载时,我也设置了相同的控件ID。
也许我可以使用另一种方法来存储这些值,例如输入隐藏字段或高速缓存。我选择使用ViewState是因为我不想为每个用户使用Session值过度负载服务器。
第三次更新:
发生了什么?
我还为我的用户控件制作了一个自定义控件,因为我需要从页面传递一些值。在构造函数中,我使用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);
}
使用以下代码重新加载:
DynamicControls.CreateDestination ud = this.LoadControl(TrackedUserControl) as DynamicControls.CreateDestination;
if (ud != null)
{
ud.ID = "DestinationUserControl";
PanelDestination.Controls.Add(ud);
}
发生了什么?