一区二区久久-一区二区三区www-一区二区三区久久-一区二区三区久久精品-麻豆国产一区二区在线观看-麻豆国产视频

ASP.NET2.0服務器控件之自定義狀態管理

     在前面的系列文章中,我們曾經介紹了視圖狀態和控件狀態的基本概念和典型應用,從中可以發現,視圖狀態和控件狀態對于自定義服務器控件實現的重要性。本文將繼續這一主題,重點介紹實現視圖狀態和控件狀態自定義管理的方法。

  自定義視圖狀態管理

  在介紹視圖狀態時,我們曾經提到過:對于簡單屬性,例如,String、Int等類型,.NET執行引擎將自動啟用默認視圖狀態管理機制,以便完成相應的功能。然而,如果開發人員在ViewState中保存的是自定義數據類型,或者需要實現自定義方式優化視圖狀態管理時,則必須實現自定義視圖狀態管理。

  實現自定義視圖狀態管理可以通過兩種方法。方法一:實現System.Web.UI命名空間中的IStateManager接口成員,其中包括IsTrackingViewState屬性和TrackViewState、SaveViewState和LoadViewState方法。這種方法主要是針對自定義數據類型的視圖狀態管理的情況。方法二:重寫Control基類的3個視圖狀態管理方法:TrackViewState、SaveViewState和LoadViewState。這些方法與IStateManager接口定義的3個方法名稱一致。這種方法主要用于通過自定義方式優化默認視圖狀態管理的情況,其主要目的在于提高效率和性能。掌握以上兩種實現方法的捷徑是,必須深刻理解.NET框架內部實現視圖狀態管理的過程。下面兩小節內容都是有關內部實現方法的介紹。每一節中均有實現代碼,實際就相當于實例代碼。所有服務器控件的自定義視圖狀態管理的實現都不會偏離那些代碼所表達的邏輯。當讀者真正掌握了那些內部實現方法,那么自定義視圖狀態管理的實現方法也就迎刃而解了。

  1、實現基于IStateManager接口的自定義視圖狀態管理

  對于復雜屬性而言,多數需要實現自定義視圖狀態管理,其關鍵是實現System.Web.UI.IStateManager接口中定義的方法和屬性。下面列舉了IStateManager接口定義代碼。

public interface IStateManager{ bool IsTrackingViewState {get;} void LoadViewState(object state); object SaveViewState(); void TrackViewState();}
  如上代碼所示,IStateManager接口要求類實現IsTrackingViewState屬性,以及LoadViewState、SaveViewState和TrackViewState方法。IsTrackingViewState屬性定義,當由類實現時,獲取一個布爾值,通過該值指示服務器控件是否正在跟蹤其視圖狀態更改。如果服務器控件正在跟蹤其視圖狀態更改,則為true;否則為false。SaveViewState方法定義,當由類實現時,將服務器控件的視圖狀態更改保存到Object中。LoadViewState方法定義,當由類實現時,加載服務器控件以前保存的控件視圖狀態,其中的參數state表示包含控件保存的視圖狀態值的Object。TrackViewState方法定義,當由類實現時,指示服務器控件跟蹤其視圖狀態更改。

  ViewState屬性與IStateManager接口之間存在密切聯系。ViewState屬性的類型是StateBag類,StateBag類通過實現IStateManager接口中定義的方法和屬性來參與狀態管理。其實現過程如下。

public sealed class StateBag : IStateManager, IDictionary,ICollection, IEnumerable{
 private bool _isTrackingViewState;
 private ArrayList _keys;
 private ArrayList _values;
 private StateItem _item;
 bool IStateManager.IsTrackingViewState {
  get { return _isTrackingViewState; }
 }
 void IStateManager.TrackViewState() {
  _isTrackingViewState = true;
 }
 object IStateManager.SaveViewState() {
  _keys = new ArrayList();
  _values = new ArrayList();
  IDictionaryEnumerator myDirctionaryEnumerator = this.GetEnumerator();
  while(myDictionaryEnumerator.MoveNext()) {
   if(this.Item[(String)myDictionaryEnumerator.Key].IsDirty) {
    _keys.Add(myDictionaryEnumerator.Key);
    _values.Add(myDictionaryEnumerator.Value);
   }
  }
  if(_keys.Count>0) {
   return new Pair(_keys,_values);
  }
 }
 void IStateManager.LoadViewState(object savedState) {
  if(savedState is Pair) {
   _keys = (ArrayList)tempP.First;
   _values = (ArrayList)tempP.Second;
   IDictionaryEnumerator myDirctionaryEnumerator = this.GetEnumerator();
   while(myDictionaryEnumerator.MoveNext()) {
    for(int j=0;j<_keys.Count;j++)
    {
     if((String)myDictionaryEnumerator.Key == _keys[j].ToString());
     {
      this.Item[_keys[j].ToString()].Value = (object)_values[j];
     }
    }
   }
  }
 }
}

  請讀者注意:以上代碼為示意性代碼,并非嚴格意義上的實現代碼。在此列出,主要是用于說明StateBag類實現IStateManager接口的邏輯過程。

  通過上面的代碼,我們可以看到:

  (1)在IsTrackingViewState屬性中,將該屬性設置為只讀,并且使用私有變量_isTrackingViewState。

  (2)在TrackViewState方法中,把IsTrackingViewState屬性使用的私有變量_isTrackingViewState設置為true,這指示系統當某個StateItem添加到StateBag中,或者某個StateItem值被修改時,StateBag類就會自動將該StateItem標記為修改過即添加dirty標記。

  (3)在SaveViewState方法中,循環StateBag中的每個StateItem,如果該StateItem被標記為dirty,那么就將其鍵和值分別添加到兩個ArrayList中,并返回該對象。

  (4)在LoadViewState方法中,執行了與SaveViewState方法相反的操作。首先將savedState對象分解為兩個保存有鍵和值的ArrayList,然后將其中的值加載到相應的StateItem對象中。

  以上就是ViewState屬性實現IStateManager接口的基本過程。所有的視圖狀態管理過程,都要使用以上的實現過程,因此理解以上邏輯對于深入掌握自定義視圖狀態管理機制具有舉足輕重的作用。

 

AspNet技術ASP.NET2.0服務器控件之自定義狀態管理,轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

主站蜘蛛池模板: 亚洲天堂日韩在线 | 91麻豆精品国产91久久久久 | 中文字幕加勒比 | 激情一区 | 九九视频免费精品视频免费 | 亚洲激情都市 | 国产精品人伦久久 | 亚洲国产爱 | 国产福利91精品一区二区 | 91精品国产福利尤物免费 | 亚洲精品国产拍拍拍拍拍 | 亚洲福利视频一区二区三区 | 激情综合色综合久久综合 | 国产精品午夜高清在线观看 | 婷婷草| 黄视频在线观看免费 | 国产麻豆视频 | 91精品在线国产 | 国产区在线观看视频 | 国产亚洲精品hd网站 | 午夜精品在线 | 日韩在线二区 | 亚洲肥熟 | 美女扒开逼自抠 | 97色蜜桃| 四虎sihu新版影院亚洲精品 | 国产男人和女人做性全部视频 | 成人精品国产 | 婷婷激情片| 九月色婷婷 | 高清一区二区三区视频 | 国产一区不卡 | 好吊色欧美一区二区三区四区 | 超91在线| 欧美一级特黄一片免费 | 九九精品视频在线 | 国产高清国内精品福利99久久 | 久久精品视频一区 | 丁香六月婷婷激情 | 久久精品视香蕉蕉er大臿蕉 | 99这里只有精品66视频 |