Asp.net

為什麼 ASP.NET 動態控制項即使添加到 Page_Load 中也能保持 ViewState?

  • July 15, 2016

我做了一些與動態控制項和 ViewState 相關的研究。

我讀到了,為了保持動態控制項的 ViewState,你必須在 Page_Init 事件中添加它。這是有道理的,因為 PageLifeCycle 是:

  1. 初始化。
  2. 載入視圖狀態。
  3. 載入回發數據。
  4. 載入。
  5. 引發回發事件。
  6. 保存視圖狀態。
  7. 使成為。

但是我製作了一個測試應用程序,我看到即使我在 Page_Load 事件中而不是之後添加控制項,ViewState 和屬性值也會保留。從這裡開始,我只發現了矛盾的資訊。有人說控制項可能會趕上 PageLifeCycle 其他人說您必須將它們添加到 Page_Init 中。有人可以為我澄清一下嗎?

同樣在msdn中我發現:

注意您可能能夠在 Page_Load 事件處理程序中載入控制項並正確維護視圖狀態。這完全取決於您是否以程式方式設置動態載入的控制項的任何屬性,如果是,那麼當您相對於 Controls.Add(dynamicControl) 行進行設置時。對此的深入討論有點超出本文的範圍,但它可能起作用的原因是因為 Controls 屬性的 Add() 方法遞歸地將父視圖狀態載入到其子視圖中,即使載入視圖狀態階段已經過去。

但我並不完全理解這一點,所以我希望有人能解釋一下。先感謝您。

此程式碼將實際展示它:

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() 添加到控制項樹時,控制項在頁面生命週期中播放以“趕上”頁面 - 關於此的文章數不勝數因為沒有太多直接的東西。

引用自:https://stackoverflow.com/questions/9548435