在我的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到我的页面。
感谢。
答案 0 :(得分:14)
查看ASP.NET Page Life Cycle和Understanding 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。