2012-03-03 75 views
8

我已经做了一些关于动态控件和ViewState的研究。为什么即使添加到Page_Load中,ASP.NET动态控件也能保持ViewState?

我读到,为了保持ViewState的动态控制,你必须将它添加到Page_Init事件中。这是有道理的,因为PageLifeCycle是:

  1. 初始化。
  2. LoadViewState。
  3. LoadPostbackData。
  4. 加载。
  5. RaisePostbackEvent。
  6. SaveViewState。
  7. 渲染。

但我做了一个测试应用程序,我发现即使我在Page_Load事件中添加控件而不是之后,ViewState和属性值也会保留。从此我只发现矛盾的信息。有人说这些控件可能赶上PageLifeCycle,其他人说你必须将它们添加到Page_Init中。有人能为我澄清这一点吗?

而且MSDN中,我发现:

注意您可以用在 Page_Load事件处理程序加载你的控制和妥善维护视图状态脱身。它 全部取决于您是否以编程方式设置 动态加载的控件的任何属性,如果是,则当您使用 时,会相对于Controls.Add(dynamicControl)行进行此操作。对此的深入讨论有点超出了本文的讨论范围,但 可能起作用的原因是因为控件属性的Add()方法递归地将父视图的状态加载到子视图中,即使是 ,尽管加载视图状态舞台已经过去了。

但我并不完全理解这个,所以我希望有人能解释它。先谢谢你。

回答

4

该代码将展示它在行动:

protected void Page_Load(object sender, EventArgs e) 
{ 
    Button b1 = new Button(); 
    Button b2 = new Button(); 
    if (!IsPostBack) 
    { 
     b1.Text = "Button1"; 
    } 
    this.form1.Controls.Add(b1); 
    this.form1.Controls.Add(b2); 
    if (!IsPostBack) 
    { 
     b2.Text = "Button2"; 
    } 
} 

因此,如果您修改控制它被添加到它保持其视图状态后的形式,但是如果你修改它,你将它添加到表之前,文本不会进入视图状态。这是什么发生 - 正好为什么这就像是另一个问题(它实际上是我会认为阅读文档的相反)。

编辑
我忘了提 - 本质上,这是由于这样的事实,通过页面生命周期的控制剧目“赶上”的页面时,它是通过Controls.Add被添加到控制树( ) - 这里有无尽的文章,因为没有太多简单的文章。

1

在过去(ASP.NET 2.0或3.5,不确定),当试图实现你提到的相同时,我不得不在Page_Init中添加控件。将它们添加到Page_Load中我不会看到在客户端进行的更改到达服务器端,这非常合理,因为当框架尝试将视图状态绑定到控件时,它们尚未创建。

我很惊讶知道这是改变了。也许在ASP.NET 4.0中引入的东西?

0

在.NET 4.5中,只需重写CreateChildControls()方法并放置在动态控件构建中。

相关问题