在回发之间失去了ascx的Viewstate

时间:2009-11-20 13:16:43

标签: asp.net viewstate

在我的ASP.NET应用程序中,我使用LoadControl动态加载.ascx,使用以下模式:

var ctrl = LoadControl("/path/to/control.ascx");
((ControlType)ctrl).SomeProperty = someData;
placeholder.Controls.Add(ctrl);

我添加的控件将SomeProperty属性值直接保存到ViewState,如下所示:

public int? SomeProperty
{
    get { return (int?)ViewState["SomeProperty"]; }
    set { ViewState["SomeProperty"] = value; }
}

在此之后,ascx控件本身就有了生命,一切都很好,直到回发发生。当页面回发时,突然视图状态为空!我怀疑这是因为我在将实例化的ascx添加到我的页面之前操纵了ViewState。另外,我可以通过在我的ascx控件的Page_Load()方法中添加以下行来防止ViewState丢失:

SomeProperty = SomeProperty;

我必须为每个属性执行上述操作以确保保留ViewState。现在,有更好的方法吗?在将实例化的.ascx添加到页面后操作ViewState不是一个选项 - 我需要Page_Init()Page_Load()方法中ViewState的内容,这些方法在我添加的时候触发。 ascx到我的页面。

感谢。

3 个答案:

答案 0 :(得分:14)

查看ASP.NET Page Life CycleUnderstanding View State。视图状态在初始化后加载,因此您将无法在Page_Init中访问它。你最好使用一个隐藏的领域。

如果您已经开始使用“查看状态”,那么您最早可以通过覆盖LoadViewState方法(请记住在尝试访问它之前调用base.LoadViewState)。

答案 1 :(得分:3)

在设置属性之前,还需要将控件添加到控件集合中。在将ViewState添加到控件集合之后,才会记录ViewState。

placeholder.Controls.Add(ctrl); 
((ControlType)ctrl).SomeProperty = someData; 

答案 2 :(得分:1)

在回发之前跟踪UserControl的ID然后在回发时重新创建控件并重新分配ID,它应该自动加载ViewState。