繁体   English   中英

动态加载的用户控件上丢失的Viewstate变量

[英]Viewstate variable lost on user control loaded dynamically

我的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);
}

发生了什么?

你什么时候加载用户控件? 如果要保存/恢复ViewState,则必须在Init事件中执行此操作。

在将控件添加到控件层次结构之前,尝试将控件存入加载/构建后将其存储到局部变量中。 这允许ViewState数据从控件映射到控件。 请参阅http://chiragrdarji.wordpress.com/2009/05/20/maintain-viewstate-for-dynamic-controls-across-the-postback/中的 “规则2”。

在UpdatePanel内动态添加控件是一个糟糕的主意。 它产生了很多问题。

如果可能,将动态控件创建移出UpdatePanel,我相信您的问题将得到解决。

正如Bryan所提到的,你应该在Page_Init而不是Page_Load中加载动态控件。

正如对页面生命周期的描述所解释的那样,当Page_Load事件发生时,已经处理了回发中的视图状态(在PreLoad中)。 如果尚未重新加载控件,则视图状态无处可去。

预载:

如果需要在Load事件之前对页面或控件执行处理,请使用此事件。

在Page实例引发此事件之前, 它会为自身和所有控件加载视图状态 ,然后处理Request实例中包含的所有回发数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM