【发布时间】:2009-11-20 13:16:42
【问题描述】:
在我的 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 添加到我的页面时触发.
谢谢。
【问题讨论】:
-
我曾经遇到过类似的问题,在我的情况下,问题是在我们所有的基础页面中,我们将所有控件设置为不使用视图状态。我的观点是,动态添加控件可能不一定是问题,但隐藏的地方 viewstate 设置为禁用。