4

我有一个UserControl动态创建几个文本框。文本框的数量取决于用户的选择。我选择将每个 ID 存储TextBoxUserControl'sViewState对象中,以便可以在每次回发时一致地重新创建它们。

Page_Init如果我在(推荐)期间重新创建动态控件,则UserControls'sViewState尚未填充。

Page_Load如果我在事件期间或之后重新创建动态控件,PreLoad则它们的回发值直到Page_Load事件之后才被重新水化,因此直到导致问题的页面生命周期的后期,我才能访问它们的正确值。

有更好的方法吗?

4

3 回答 3

2

我遇到了类似的 Catch 22——我需要向我的页面添加动态用户控件,但它们取决于用户所做的下拉列表选择。当然,在设置视图状态之前,下拉列表的值无法访问,但如果我们希望用户控件通过视图状态保持自己的状态,建议在 Page_Init 中创建用户控件,但那是在视图状态存在之前,所以我无法轮询从那里下拉列表。

另一个对我有用的建议——从 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 模型中已经存在了这么多年。

于 2014-10-10T16:49:02.467 回答
0

正如 msdn http://msdn.microsoft.com/en-us/library/ms178472(VS.100).aspx所指出的那样;您可以使用 InitComplete 事件来访问 viewstate 数据。但有时 viewstate 数据会变大并导致整体性能问题。或者您可以使用会话对象或不可见的控件来存储您的数据。

于 2013-09-11T11:49:52.900 回答
0

看来,压倒一切CreateChildControls是要走的路。它并不总是在页面生命周期的同一点调用,请参阅http://msdn.microsoft.com/en-us/library/aa719775%28VS.71%29.aspx

表中未列出 CreateChildControls 方法,因为每当 ASP.NET 页面框架需要创建控件树时都会调用它,并且此方法调用不限于控件生命周期中的特定阶段。例如,可以在加载页面时、数据绑定期间或呈现期间调用 CreateChildControls。

但是,这似乎是最佳实践(当“必须”我使用 asp.net CreateChildControls()?)并且与它结合使用EnsureChildControls()时,总是在适当的时候调用ViewState可用的数据。

于 2013-09-11T13:24:37.627 回答