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

ASP.NET 伺服器控件開發精要:控制項狀態 vs 視圖狀態深度解析

     編輯:關於ASP.NET

為什麼需要控制項狀態?

在 ASP.NET 2.0 之前,開發自訂伺服器控制項時,若需跨回傳保留關鍵狀態(如 GridView 的分頁索引、TabContainer 的作用中索引標籤),唯一選擇是 ViewState。然而 ViewState 可在頁面或控制項層級被關閉(EnableViewState="false"),一旦關閉,控制項核心功能將失效。為解決此痛點,ASP.NET 2.0 引入 控制項狀態——不可被關閉、專供控制項內部使用、不佔用頁面層級 ViewState 配額的狀態持久化機制。

控制項狀態核心特性

特性視圖狀態控制項狀態
可被關閉是否
作用範圍頁面/控制項僅控制項
儲存位置__VIEWSTATE 隱藏欄位__VIEWSTATE 或獨立隱藏欄位
序列化優化類型基本型別、集合、TypeConverter同上,預設支援更廣
生命週期事件SaveViewState / LoadViewStateSaveControlState / LoadControlState
執行順序較晚優於 ViewState

支援的資料型別

控制項狀態預設支援:Array、DateTime、Int16/32、String、ArrayList、Double、Boolean、Enum、Byte、Hashtable、Pair、Triplet、Char、HybridDictionary、Single、Type、Color、IDictionary 等,並可透過 TypeConverter 擴展自訂型別。

實作三步驟

  1. 註冊需求:在 OnInit 中呼叫 Page.RegisterRequiresControlState(this)。
  2. 儲存狀態:覆寫 SaveControlState,回傳需持久化的物件(通常為非預設值)。
  3. 載入狀態:覆寫 LoadControlState(object state),還原儲存的物件。

完整程式碼範例:可記住選取索引的 Tab 控制項

public class SmartTabControl : WebControl {
    private int _activeTabIndex = 0;

    protected override void OnInit(EventArgs e) {
        Page.RegisterRequiresControlState(this);
        base.OnInit(e);
    }

    protected override object SaveControlState() {
        return _activeTabIndex != 0 ? (object)_activeTabIndex : null;
    }

    protected override void LoadControlState(object savedState) {
        if (savedState != null) _activeTabIndex = (int)savedState;
    }

    // 渲染邏輯略...
}

進階應用場景

  • GridView 自訂分頁/排序:儲存 PageIndex、SortExpression、SortDirection,確保使用者關閉 ViewState 仍能正常分頁排序。
  • 複合控制項內部協調:父控制項儲存子控制項的關鍵狀態(如選取節點、展開狀態),避免 ViewState 關閉導致樹狀結構崩潰。
  • 安全敏感資料:控制項狀態同樣支援 EnableViewStateMAC 與加密,適合儲存非敏感但關鍵的 UI 狀態。

效能與最佳實踐

  1. 只儲存必要資料:SaveControlState 僅回傳非預設值,減少隱藏欄位體積。
  2. 避免深層物件圖:優先使用基本型別或簡單集合,複雜物件請實作 TypeConverter。
  3. 配合 ViewState 使用:UI 顯示相關狀態(如樣式、資料內容)用 ViewState;控制項運作邏輯關鍵狀態用 ControlState。
  4. 測試關閉 ViewState 情境:開發階段務必在頁面設定 EnableViewState="false" 驗證控制項核心功能完整。

總結

控制項狀態是 ASP.NET 2.0 為解決「ViewState 可被關閉導致控制項失效」而設計的關鍵機制。掌握 RegisterRequiresControlState、SaveControlState、LoadControlState 三要素,能讓你開發出更健壯、可重用的伺服器控制項,在任何 ViewState 設定下都能正常運作。

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