動態 Web 伺服器控制項和檢視狀態

更新:2007 年 11 月

當在執行階段動態建立 Web 伺服器控制項時,關於控制項的部分資訊會存放在和網頁一起呈現的檢視狀態中。但是,當網頁回傳伺服器時,非動態控制項 (也就是在網頁上定義的控制項) 會在網頁的 Init 事件中加以具現化,並且會在重新建立動態控制項之前先載入檢視狀態資訊 (通常在 Page_Load 處理常式中)。實際上,在重新建立動態控制項之前,檢視狀態會暫時無法與網頁的控制項保持同步。在執行 Page_Load 事件後 (但在呼叫控制項事件處理方法之前),遺留的檢視狀態資訊會載入動態建立的控制項中。

在多數案例中,這種檢視狀態處理模型都可正常運作。您通常會將動態控制項加入至容器的控制項集合的最後面。這樣一來,為動態控制項儲存的檢視狀態資訊,就會是適當容器的檢視狀態結構尾端的額外資訊,而網頁在控制項建立之前都可以忽略這項資訊。

不過,動態建立的控制項,其檢視狀態資訊在下列兩個案例中可能會造成問題:

  • 如果您在現有控制項之間插入動態控制項。

  • 如果您先以動態方式插入控制項,接著在往返作業期間重新插入具有不同值的同樣控制項。

如果您在現有控制項之間插入動態控制項,動態控制項的檢視狀態資訊就會插入檢視狀態結構的對應位置。當張貼網頁和載入檢視狀態時,動態控制項還不存在,因此,檢視狀態中的額外資訊不會對應到正確的控制項。結果通常是表示轉換無效的錯誤。

如果您在每次往返作業期間都重新插入控制項,則每次產生動態建立的控制項時,都會從先前一組控制項的檢視狀態取得屬性 (Property) 值。在許多情況中,您可以藉由將容器控制項的 EnableViewState 屬性設定為 false 避免這個問題。這樣一來,就不會儲存動態控制項的資訊,而因此控制項的後續版本也不會發生衝突。

如需檢視狀態的詳細資訊,請參閱

ASP.NET 網頁存留週期概觀

ASP.NET 狀態管理概觀ViewState

請參閱

其他資源

以程式設計方式加入 ASP.NET 控制項

以程式設計方式設定 ASP.NET 伺服器控制項屬性