ViewState 是 ASP.NET 頁面生命周期的核心,但許多開發者僅知其用法而不懂底層機制。本文從 Control 基類的 ViewState 屬性切入,剖析 StateBag 結構與 IStateManager 接口,為自定義狀態管理奠定基礎。
所有繼承自 Control 或 WebControl 的類別自動擁有 ViewState 屬性:
protected virtual StateBag ViewState { get { ... } set { ... } }
public sealed class StateBag : IStateManager, IDictionary, ICollection, IEnumerable {
private IDictionary bag;
private bool marked;
public StateBag(bool ignoreCase) {
this.marked = false;
this.ignoreCase = ignoreCase;
this.bag = this.CreateBag();
}
private IDictionary CreateBag() {
return new HybridDictionary(this.ignoreCase);
}
// ... 實現 IDictionary、IStateManager 等介面
}
HybridDictionary(小數據用 ListDictionary,大數據自動轉 Hashtable)。LoadViewState、SaveViewState、TrackViewState、IsTrackingViewState。TrackViewState():頁面初始化階段調用,將 marked 設為 true,開始追蹤後續修改。ViewState["Key"] = value 會將項目標記為 dirty。SaveViewState():僅序列化 dirty 項目,輸出為 Pair 或 Triplet 結構。LoadViewState():回發時反序列化並還原到 bag 中。若需為自定義控件實現獨立的狀態管理,應實作 IStateManager 並納入控件的 ViewState 體系,或直接在控件中重寫 LoadViewState/SaveViewState/TrackViewState。
StateBag 是 ViewState 的物理容器,IStateManager 是邏輯契約。理解兩者協作機制,有助於設計高效、可控的自定義狀態持久化方案。