我有UserControl
动态创建多个TextBox。 TextBoxes的数量取决于用户选择。我选择将每个TextBox
的ID存储在UserControl
的{{1}}对象中,以便可以在每个回发中一致地重新创建它们。
如果我在ViewState
期间重新创建动态控件(按建议使用),则Page_Init
的{{1}}尚未填充。
如果我在UserControls
或ViewState
期间重新创建动态控件,那么在Page_Load
事件发生之前,它们的回发值不会被重新水化,因此我无法访问其正确的值直到页面生命周期的后期才导致问题。
有更好的方法吗?
答案 0 :(得分:1)
我遇到了类似的Catch 22 - 我需要将动态用户控件添加到我的页面,但它们依赖于用户做出的下拉列表选择。当然,在设置viewstate之前,该下拉列表的值不可访问,但如果我们希望它们通过viewstate维护自己的状态,则建议在Page_Init中创建用户控件,但是#view;在viewstate存在之前,所以我无法从那里轮询下拉列表。
另一个适合我的建议 - 从Request.Form集合中获取下拉列表的值:
protected void Page_Init(object sender, EventArgs e)
{
//get the user's DropDownList selection
int visualizerMode = Int32.Parse(Request.Form[ddlVisualizerMode.UniqueID]);
//now dynamically load a usercontrol based on that value
LoadUserControl(visualizerMode);
}
......这对我很有用。这是直接使用HTML表单的回归,我经常忘记这一点,因为它已经在ASP.NET WebForms模型中使用了这么多年。
答案 1 :(得分:0)
正如msdn http://msdn.microsoft.com/en-us/library/ms178472(VS.100).aspx指出的那样;您可以使用InitComplete事件来访问viewstate数据。但有时viewstate数据变得更大并且整体上会出现性能问题。或者您可以使用会话对象或不可访问的控制来存储您的数据。
答案 2 :(得分:0)
看来,覆盖CreateChildControls
是可行的方法。它并不总是在页面生命周期的同一点调用,请参阅http://msdn.microsoft.com/en-us/library/aa719775%28VS.71%29.aspx
CreateChildControls方法未在表中列出,因为它 每当ASP.NET页面框架需要创建时调用 控制树和此方法调用不限于特定阶段 在控件的生命周期中。例如,CreateChildControls可以 在加载页面时,在数据绑定期间或在渲染期间调用。
但是,这似乎是最佳做法(When "must" I use asp.net CreateChildControls()?),当与EnsureChildControls()
结合使用时,始终会在适当的时候调用ViewState
数据。