ASP.NET:视图状态和以编程方式添加用户控件

8
使用LoadControl(string path)方法在程序中添加用户控件时,当用户控件的页面生命周期中初始化其子控件的视图状态?我之所以问这个问题,是因为我的一个用户控件在Postback上没有通过它的视图状态在Page_Load事件中被初始化/加载(而这种情况不适用于常规的.aspx页面,这让我很困惑)。总的来说,我需要从文本框控件中检索值。谢谢。

这个回答解决了你的问题吗?动态添加的控件无法触发事件 - Peter O.
1个回答

11

在Page_Load事件之前,ViewState已经被加载。如果您希望控件能够使用ViewState,您需要在该事件之前将其加载并添加到页面上,通常是在PreInit事件中。

有关生命周期的参考文档在此处:
http://msdn.microsoft.com/en-us/library/ms178472.aspx?ppud=4

请阅读Pre Load事件的描述,它紧接着Page Load:

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

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

因此,在Pre Load时间点之前,已经为控件加载了视图状态,所以已经太晚了。此外,PreInit事件的描述特别提到它是“创建或重新创建动态控件”的地方。


谢谢!另外,我正在以编程方式添加的用户控件出现在另一个以声明方式加载的用户控件中。这个声明的父用户控件的PreInit事件不会被触发(因此方法'protected void Page_PreInit(object sender,EventArgs e)'不会被调用)。您知道为什么Page_PreInit在这个声明的用户控件中不会被调用吗? - burnt1ce
控件本身没有预初始化,因为控件页面的生命周期事件是从页面中调用的,在PreInit点上,控件还没有准备好。请改用Init。 - Joel Coehoorn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接