在我的 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 控件将独立生活,一切正常,直到发生回发。当页面回发时, View 状态突然变为空!我怀疑发生这种情况是因为我在将实例化的 ascx 添加到页面之前操作了 ViewState。另外,我可以通过在 ascx 控件的 Page_Load()
方法中添加以下行来防止 ViewState 丢失:
SomeProperty = SomeProperty;
我必须对每个属性执行上述操作,以确保保留 ViewState。现在,有没有更好的方法来做到这一点?在实例化的 .ascx 添加到页面后操作 ViewState 不是一个选项 - 我需要 Page_Init()
和 Page_Load()
方法中 ViewState 的内容,在我将 .ascx 添加到页面时立即触发。
谢谢。
最佳答案
看看ASP.NET Page Life Cycle和 Understanding View State 。 View 状态在初始化后加载,因此您将无法在 Page_Init
中访问它。你最好使用隐藏字段。
如果您执意要使用 View 状态,那么最早可以通过覆盖 LoadViewState
方法(请记住在尝试之前调用 base.LoadViewState
访问它)。
关于asp.net - ascx 的 View 状态在回发之间丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1770366/