为什么ASP.NET动态控件即使在Page_Load中添加时也能保持ViewState?

时间:2012-03-03 17:57:16

标签: asp.net dynamic controls lifecycle

我做了一些与动态控制和ViewState相关的研究。

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

  1. 初始化。
  2. LoadViewState。
  3. LoadPostbackData。
  4. 加载。
  5. RaisePostbackEvent。
  6. SaveViewState。
  7. 渲染。
  8. 但是我制作了一个测试应用程序,我发现即使我在Page_Load事件中添加控件而不是之后,ViewState和属性值也会保留。从此我才发现矛盾的信息。有人说控件可能会追上PageLifeCycle其他人说你必须在Page_Init中添加它们。有人可以为我澄清一下吗?

    同样在msdn中我发现:

      

    注意您可以通过加载控件来逃脱   Page_Load事件处理程序并正确维护视图状态。它   一切都取决于你是否设置了任何属性   以编程方式动态加载控件,如果是,则在何时执行   相对于Controls.Add(dynamicControl)行做它。彻底的   对此的讨论有点超出了本文的范围,但是   它可能起作用的原因是因为Controls属性的Add()方法   甚至可以递归地将父视图状态加载到其子视图中   虽然加载视图状态阶段已经过去了。

    但我并不完全理解这一点,所以我希望有人可以解释一下。提前谢谢。

3 个答案:

答案 0 :(得分: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 :(得分:1)

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

我很惊讶地知道这已经改变了。也许在ASP.NET 4.0中引入了一些东西?

答案 2 :(得分:0)

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