中文字幕日韩一区二区_国产一区二区av_国产毛片av_久久久久国产一区_色婷婷电影_国产一区二区精品

ASP.NET2.0服務(wù)器控件之自定義狀態(tài)管理

     在前面的系列文章中,我們?cè)?jīng)介紹了視圖狀態(tài)和控件狀態(tài)的基本概念和典型應(yīng)用,從中可以發(fā)現(xiàn),視圖狀態(tài)和控件狀態(tài)對(duì)于自定義服務(wù)器控件實(shí)現(xiàn)的重要性。本文將繼續(xù)這一主題,重點(diǎn)介紹實(shí)現(xiàn)視圖狀態(tài)和控件狀態(tài)自定義管理的方法。

  自定義視圖狀態(tài)管理

  在介紹視圖狀態(tài)時(shí),我們?cè)?jīng)提到過(guò):對(duì)于簡(jiǎn)單屬性,例如,String、Int等類型,.NET執(zhí)行引擎將自動(dòng)啟用默認(rèn)視圖狀態(tài)管理機(jī)制,以便完成相應(yīng)的功能。然而,如果開(kāi)發(fā)人員在ViewState中保存的是自定義數(shù)據(jù)類型,或者需要實(shí)現(xiàn)自定義方式優(yōu)化視圖狀態(tài)管理時(shí),則必須實(shí)現(xiàn)自定義視圖狀態(tài)管理。

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

  1、實(shí)現(xiàn)基于IStateManager接口的自定義視圖狀態(tài)管理

  對(duì)于復(fù)雜屬性而言,多數(shù)需要實(shí)現(xiàn)自定義視圖狀態(tài)管理,其關(guān)鍵是實(shí)現(xiàn)System.Web.UI.IStateManager接口中定義的方法和屬性。下面列舉了IStateManager接口定義代碼。

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

  ViewState屬性與IStateManager接口之間存在密切聯(lián)系。ViewState屬性的類型是StateBag類,StateBag類通過(guò)實(shí)現(xiàn)IStateManager接口中定義的方法和屬性來(lái)參與狀態(tài)管理。其實(shí)現(xiàn)過(guò)程如下。

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];
     }
    }
   }
  }
 }
}

  請(qǐng)讀者注意:以上代碼為示意性代碼,并非嚴(yán)格意義上的實(shí)現(xiàn)代碼。在此列出,主要是用于說(shuō)明StateBag類實(shí)現(xiàn)IStateManager接口的邏輯過(guò)程。

  通過(guò)上面的代碼,我們可以看到:

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

  (2)在TrackViewState方法中,把IsTrackingViewState屬性使用的私有變量_isTrackingViewState設(shè)置為true,這指示系統(tǒng)當(dāng)某個(gè)StateItem添加到StateBag中,或者某個(gè)StateItem值被修改時(shí),StateBag類就會(huì)自動(dòng)將該StateItem標(biāo)記為修改過(guò)即添加dirty標(biāo)記。

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

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

  以上就是ViewState屬性實(shí)現(xiàn)IStateManager接口的基本過(guò)程。所有的視圖狀態(tài)管理過(guò)程,都要使用以上的實(shí)現(xiàn)過(guò)程,因此理解以上邏輯對(duì)于深入掌握自定義視圖狀態(tài)管理機(jī)制具有舉足輕重的作用。

 

AspNet技術(shù)ASP.NET2.0服務(wù)器控件之自定義狀態(tài)管理,轉(zhuǎn)載需保留來(lái)源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 国产99视频精品免费播放照片 | 日本视频中文字幕 | 黄色在线观看国产 | 中文字幕日本一区二区 | 日本不卡视频 | 在线国产视频 | 91在线看网站| 欧美日高清 | 99伊人 | 亚洲国产精品视频一区 | 日韩欧美在线一区 | av男人的天堂在线 | 久久国产精品一区 | 久久一区二区av | 亚洲欧美在线免费观看 | h视频在线播放 | 日本a视频 | 欧美jizzhd精品欧美巨大免费 | 91动漫在线观看 | 麻豆久久久 | 国产精品99久久久久久动医院 | 天天躁日日躁性色aⅴ电影 免费在线观看成年人视频 国产欧美精品 | 久久久影院| 久久久久国产一区二区三区 | 日本精品一区二区 | 欧美日韩国产精品激情在线播放 | 国产乱码精品一区二区三区五月婷 | www.黄色在线观看 | 羞羞视频网页 | 狠狠狠| 国产激情视频在线 | 精品熟人一区二区三区四区 | 一区二区三区精品在线 | 欧美一级黄色免费看 | 99re视频在线观看 | 欧美日韩综合 | 精品一区二区三区av | 久久亚洲国产精品日日av夜夜 | 日本一二三区在线观看 | 国产精品久久久久久吹潮 | 在线播放国产一区二区三区 |