ASP.NET 2.0 引入 ControlState 區別於 ViewState,確保控制項核心運作資料(如分頁索引)即使關閉 ViewState 仍能保存。自訂控制項開發者需掌握兩種狀態的自訂管理技巧。
LoadViewState、SaveViewState、TrackViewState、IsTrackingViewStateTrackViewState、SaveViewState、LoadViewState,優化預設機制以提升效能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];
}
}
GridView 的 PageIndex、DataKeyNames)OnInit 呼叫 Page.RegisterRequiresControlState(this)SaveControlState、LoadControlState善用 ControlState 讓使用者關閉 ViewState 時控制項仍能正常運作,是優質自訂控制項的標誌。