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

m3s*_*3s5 8 asp.net lifecycle controls dynamic

我做了一些与动态控件和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)行执行此操作.对此的深入讨论有点超出了本文的范围,但它可能起作用的原因是因为Controls属性的Add()方法以递归方式将父视图状态加载到其子节点中,即使已经过了加载视图状态阶段.

但我并不完全理解这一点,所以我希望有人可以解释一下.先感谢您.

dic*_*ice 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";
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,如果您在将控件添加到表单后对其进行修改,它将保留其视图状态,但如果您在将其添加到表单之前对其进行修改,则文本不会使其进入视图状态。这就是发生的事情- 到底为什么会这样是另一个问题(这实际上与我阅读文档时的想法相反)。

编辑
我忘了提及 - 本质上这是因为当通过 Controls.Add() 将控件添加到控件树时,控件会在页面生命周期中播放以“赶上”页面 - 关于此的文章有无数的文章因为没有太多直接的内容。