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

ASP.NET 2.0 自訂伺服器控制項:ViewState 與 ControlState 進階管理

     編輯:關於ASP.NET

ASP.NET 2.0 引入 ControlState 區別於 ViewState,確保控制項核心運作資料(如分頁索引)即使關閉 ViewState 仍能保存。自訂控制項開發者需掌握兩種狀態的自訂管理技巧。

自訂 ViewState 管理兩大路徑

  1. 實作 IStateManager:適用於自訂型別屬性,需實作 LoadViewState、SaveViewState、TrackViewState、IsTrackingViewState
  2. 覆寫 Control 基類方法:覆寫 TrackViewState、SaveViewState、LoadViewState,優化預設機制以提升效能

StateBag 內部實作原理 (簡化)

public sealed class StateBag : IStateManager
{
    bool _isTracking;
    ArrayList _keys, _values;

    void IStateManager.TrackViewState() { _isTracking = true; }

    object IStateManager.SaveViewState()
    {
        // 只儲存 IsDirty=true 的項目
        foreach (var item in this)
            if (item.IsDirty) { _keys.Add(item.Key); _values.Add(item.Value); }
        return _keys.Count > 0 ? new Pair(_keys, _values) : null;
    }

    void IStateManager.LoadViewState(object savedState)
    {
        if (savedState is Pair p)
            for (int i=0; i<((ArrayList)p.First).Count; i++)
                this[((ArrayList)p.First)[i].ToString()] = ((ArrayList)p.Second)[i];
    }
}

ControlState 使用時機

  • 控制項必須保存的極少量資料(如 GridView 的 PageIndex、DataKeyNames)
  • 在 OnInit 呼叫 Page.RegisterRequiresControlState(this)
  • 覆寫 SaveControlState、LoadControlState

善用 ControlState 讓使用者關閉 ViewState 時控制項仍能正常運作,是優質自訂控制項的標誌。

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