首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> 關於ASP.NET

ASP.NET ViewState 運作原理深度解析:StateBag 與 IStateManager

     編輯:關於ASP.NET

ViewState 是 ASP.NET 頁面生命周期的核心,但許多開發者僅知其用法而不懂底層機制。本文從 Control 基類的 ViewState 屬性切入,剖析 StateBag 結構與 IStateManager 接口,為自定義狀態管理奠定基礎。

一、ViewState 來源

所有繼承自 Control 或 WebControl 的類別自動擁有 ViewState 屬性:

protected virtual StateBag ViewState { get { ... } set { ... } }

二、StateBag 內部結構

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 等介面
}
  • bag:底層儲存容器,採用 HybridDictionary(小數據用 ListDictionary,大數據自動轉 Hashtable)。
  • marked:標記項目是否已修改,決定是否寫入 ViewState。
  • IStateManager:核心介面,定義 LoadViewState、SaveViewState、TrackViewState、IsTrackingViewState。

三、關鍵流程

  1. TrackViewState():頁面初始化階段調用,將 marked 設為 true,開始追蹤後續修改。
  2. 屬性賦值時:ViewState["Key"] = value 會將項目標記為 dirty。
  3. SaveViewState():僅序列化 dirty 項目,輸出為 Pair 或 Triplet 結構。
  4. LoadViewState():回發時反序列化並還原到 bag 中。

四、自定義狀態管理的切入點

若需為自定義控件實現獨立的狀態管理,應實作 IStateManager 並納入控件的 ViewState 體系,或直接在控件中重寫 LoadViewState/SaveViewState/TrackViewState。

五、總結

StateBag 是 ViewState 的物理容器,IStateManager 是邏輯契約。理解兩者協作機制,有助於設計高效、可控的自定義狀態持久化方案。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved