• <fieldset id="8imwq"><menu id="8imwq"></menu></fieldset>
  • <bdo id="8imwq"><input id="8imwq"></input></bdo>
    最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
    問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
    當前位置: 首頁 - 科技 - 知識百科 - 正文

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

    來源:懂視網 責編:小采 時間:2020-11-27 22:45:50
    文檔

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

    ASP.NET2.0服務器控件之自定義狀態管理: 在前面的系列文章中,我們曾經介紹了視圖狀態和控件狀態的基本概念和典型應用,從中可以發現,視圖狀態和控件狀態對于自定義服務器控件實現的重要性。本文將繼續這一主題,重點介紹實現視圖狀態和控件狀態自定義管理的方法。 自定義視圖狀態管理 在介紹視圖
    推薦度:
    導讀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對象中。

      

    聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

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

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

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 久久久久久国产精品无码下载| 亚洲愉拍自拍欧美精品| jizzjizz国产精品久久| 国产乱人伦偷精品视频免观看| 国产美女精品一区二区三区| 无码日韩精品一区二区人妻| 国产91在线精品| 国产精品久久久久9999高清| 热re99久久精品国99热| 亚洲国产小视频精品久久久三级 | 中文精品一卡2卡3卡4卡| 国产成人精品手机在线观看| 亚洲日韩精品一区二区三区无码| 精品人妻少妇一区二区| 国产精品小视频免费无限app| 国产精品亚洲片夜色在线| 中文精品人人永久免费| 久久久久久国产精品免费无码| 国产情侣大量精品视频| 狠狠色丁香婷婷综合精品视频| 日韩精品久久久久久久电影蜜臀| 亚洲精品无码久久毛片| 日韩精品人妻av一区二区三区| 国产综合免费精品久久久| 国产精品第六页| 国产成人精品久久综合| 91精品在线国产| 中文字幕亚洲精品| 97精品国产97久久久久久免费| 热re99久久精品国产99热| 久久国产精品久久| 国产亚洲精品一品区99热| 国产99视频精品免视看7| 精品一区二区三区在线观看视频| 人妻少妇精品无码专区二区| 色妞ww精品视频7777| 精品一区二区三区东京热| 久久综合久久自在自线精品自| 欧美成人精品高清在线观看| 久久久久人妻一区精品色| 亚洲αv在线精品糸列|