偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

ASP.NET控件開發(fā)基礎之自定義視圖狀態(tài)管理

開發(fā) 后端
ASP.NET控件開發(fā)基礎之自定義視圖狀態(tài)管理是如何實現(xiàn)的呢?那么本文就向你介紹ASP.NET控件開發(fā)基礎之自定義視圖狀態(tài)管理的相關內(nèi)容。

ASP.NET控件開發(fā)基礎之自定義視圖狀態(tài)管理是如何建立的呢?剛開篇的時后在最后把屬性值用視圖狀態(tài)來保存時,得以把當前狀態(tài)保存下來,關于視圖狀態(tài)的概述,這里不再累贅,沒了解過的朋友可以在MSDN里輸入視圖狀態(tài)概述了解一下.以下我們還是以以前講過的內(nèi)容為例,一起繼續(xù)來改善控件的使用。

ASP.NET控件開發(fā)基礎之自定義視圖狀態(tài)管理示例一

我們啟用了跟蹤,按下確定按鈕后,控件屬性發(fā)生變化,按下無事件按鈕后,控件狀態(tài)則恢復到之前的狀態(tài),而且在跟蹤狀態(tài)下發(fā)現(xiàn)Custom無視圖狀態(tài).

  1. ﹤%@ Page Language="C#" Trace="true" %﹥  
  2. ﹤%@ Register Assembly="CustomComponents" Namespace="CustomComponents" TagPrefix="custom" %﹥  
  3. ﹤!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
  4.  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"﹥  
  5. ﹤script runat="server"﹥  
  6.     protected void Button1_Click(object sender, EventArgs e)  
  7.     {  
  8.         Custom1.Age = 21;  
  9.         Custom1.CustomMetier = Metier.教師;  
  10.         Custom1.CustomAddress.City = "杭州";  
  11.         Custom1.CustomAddress.State = "中國";  
  12.         Custom1.CustomAddress.Street = "街道";  
  13.         Custom1.CustomAddress.Zip = "310000";  
  14.     }  
  15. ﹤/script﹥  
  16. ﹤html xmlns="http://www.w3.org/1999/xhtml" ﹥  
  17. ﹤head runat="server"﹥  
  18.     ﹤title﹥無標題頁﹤/title﹥  
  19. ﹤/head﹥  
  20. ﹤body﹥  
  21.     ﹤form id="form1" runat="server"﹥  
  22.     ﹤div﹥  
  23.         ﹤custom:Custom ID="Custom1" runat="server"﹥  
  24.         ﹤/custom:Custom﹥  
  25.         ﹤br /﹥  
  26.         ﹤br /﹥  
  27.         ﹤asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="確定" /﹥  
  28.               
  29.         ﹤asp:Button ID="Button2" runat="server" Text="無事件" /﹥   
  30.     ﹤/div﹥  
  31.     ﹤/form﹥  
  32. ﹤/body﹥  
  33. ﹤/html﹥ 

那么接下來將修改Custom的屬性更改為視圖狀態(tài)保存,代碼如下

重新編譯一下代碼,再次測試上面代碼Custom的Age和CustomMetier屬性可以保存其狀態(tài),而無法保存CustomAddress這個復雜屬性的狀態(tài)值.這個也可以理解,我們沒有為CustomAddress的子屬性值保存在視圖狀態(tài)里.啟動跟蹤后,還發(fā)現(xiàn)Custom控件在更改控件屬性后保存了一部分的視圖狀態(tài).

  1. #region 屬性  
  2.  
  3.         [Description("年齡")]  
  4.         public int Age  
  5.         {  
  6.             get { return ViewState["Age"] != null ? (int)ViewState["Age"] : 0; }  
  7.             set { ViewState["Age"] = value; }  
  8.         }  
  9.           
  10.         [Description("姓名")]  
  11.         public String Name  
  12.         {  
  13.             get { return ViewState["Name"] != null ? (string)ViewState["Name"] : string.Empty; }  
  14.             set { ViewState["Name"] = value; }  
  15.         }  
  16.         [TypeConverter(typeof(GameConverter))]  
  17.         [Description("喜歡的游戲")]  
  18.         public String Game  
  19.         {  
  20.             get { return ViewState["Game"] != null ? (string)ViewState["Game"] : string.Empty; }  
  21.             set { ViewState["Game"] = value; }  
  22.         }  
  23.  
  24.         [Description("職業(yè)")]  
  25.         public Metier CustomMetier  
  26.         {  
  27.             get { return ViewState["CustomMetier"] != null ? (Metier)ViewState["CustomMetier"] : Metier.程序員; }  
  28.             set { ViewState["CustomMetier"] = value; }  
  29.         }  
  30.           
  31.  
  32.         #endregion 

接下來我們更改Address的字屬性,把其值保存在視圖狀態(tài)下.

ASP.NET控件開發(fā)基礎之自定義視圖狀態(tài)管理代碼如下:

  1. #region 屬性  
  2.         [  
  3.        Category("Behavior"),  
  4.        DefaultValue(""),  
  5.        Description("街道"),  
  6.        NotifyParentProperty(true),  
  7.        ]  
  8.         public String Street  
  9.         {  
  10.             get { return ViewState["Street"] != null ? (string)ViewState["Street"] : String.Empty; }  
  11.             set { ViewState["Street"] = value; }  
  12.         }  
  13.  
  14.        [  
  15.        Category("Behavior"),  
  16.        DefaultValue(""),  
  17.        Description("城市"),  
  18.        NotifyParentProperty(true),  
  19.        ]  
  20.         public String City  
  21.         {  
  22.             get { return ViewState["City"] != null ? (string)ViewState["City"] : String.Empty; }  
  23.             set { ViewState["City"] = value; }  
  24.         }  
  25.  
  26.        [  
  27.        Category("Behavior"),  
  28.        DefaultValue(""),  
  29.        Description("國籍"),  
  30.        NotifyParentProperty(true),  
  31.        ]  
  32.  
  33.         public String State  
  34.         {  
  35.             get { return ViewState["State"] != null ? (string)ViewState["State"] : String.Empty; }  
  36.             set { ViewState["State"] = value; }  
  37.         }  
  38.  
  39.        [  
  40.        Category("Behavior"),  
  41.        DefaultValue(""),  
  42.        Description("郵編"),  
  43.        NotifyParentProperty(true)  
  44.        ]  
  45.         public String Zip  
  46.         {  
  47.             get { return ViewState["Zip"] != null ? (string)ViewState["Zip"] : String.Empty; }  
  48.             set { ViewState["Zip"] = value; }  
  49.         }  
  50.  
  51.         #endregion 

重新編譯后,發(fā)現(xiàn)問題了,編譯不通過,當前上下文不存在名稱ViewState.如果這些屬性直接定義在Custom控件下則一點問題也沒有,但下面定義的是Address復雜屬性的子屬性.而Address屬性又不能繼承Control類,所以我們需要自定義一個ViewState屬性

ASP.NET控件開發(fā)基礎之自定義視圖狀態(tài)管理如下代碼:

  1. private bool _isTrackingViewState;  
  2. private StateBag _viewState;  
  3.  
  4. protected StateBag ViewState  
  5.         {  
  6.             get 
  7.             {  
  8.                 if (_viewState == null)  
  9.                 {  
  10.                     _viewState = new StateBag(false);  
  11.                     if (_isTrackingViewState) ((IStateManager)_viewState).TrackViewState();  
  12.                 }  
  13.                 return _viewState;  
  14.             }  
  15.         } 

先定義兩個變量,然后定義一個ViewState屬性,ViewState類型本身便是一個StateBag類型.大家一定注意到了 IStateManager接口,下面還有一個TrackViewState方法.先不管他.重新編譯下,編譯通過,重新測試下,發(fā)現(xiàn)還是沒有變化.

MSDN上對ViewState能保存的值已經(jīng)講的很清楚了.你可以保存一些簡單類型,但無法保存自定義類型,而我們定義的Address就是一個自定義類型.為保存自定義類型數(shù)據(jù),所以我們需要自定義類型狀態(tài)管理

自定義類型狀態(tài)管理,那么我們就必須接觸到IStateManager這個接口,此接口有一個屬性和三個方法,如下

一個屬性和三個方法 

所以Address要繼承IStateManager接口,并顯示實現(xiàn)接口屬性和方法,注意是顯示實現(xiàn) .

下面看Address類具體的自定義狀態(tài)管理代碼

  1. #region   
  2.  
  3.         bool IStateManager.IsTrackingViewState  
  4.         {  
  5.             get 
  6.             {  
  7.                 return _isTrackingViewState;  
  8.             }  
  9.         }  
  10.  
  11.         void IStateManager.LoadViewState(object savedState)  
  12.         {  
  13.             if (savedState != null)  
  14.             {  
  15.                 ((IStateManager)ViewState).LoadViewState(savedState);  
  16.             }  
  17.         }  
  18.  
  19.         object IStateManager.SaveViewState()  
  20.         {  
  21.             object savedState = null;  
  22.             if (_viewState != null)  
  23.             {  
  24.                 savedState =  
  25.                    ((IStateManager)_viewState).SaveViewState();  
  26.             }  
  27.             return savedState;  
  28.         }  
  29.  
  30.         void IStateManager.TrackViewState()  
  31.         {  
  32.             _isTrackingViewState = true;  
  33.               
  34.             if (_viewState != null)  
  35.             {  
  36.                 ((IStateManager)_viewState).TrackViewState();  
  37.             }  
  38.         }  
  39.  
  40.         #endregion 

理解控件自定義的狀態(tài)管理,你有必要了解控件的生命周期,了解控件生命周期,那問題就迎刃而解了.

大家可以翻閱MSND的控件執(zhí)行生命周期

我個人認為最好的理解方法就是為上面代碼設置三個斷點, 如下圖

設置三個斷點 

好了,下面把我們測試的那個aspx頁面設置為起始頁,然后按F5,開始測試.

本該啟動后跳到TrackViewState方法里,但沒跳進來,好怪,而且自定義類型狀態(tài)管理后頁面并未保存其值.

讓我們回到Custom類里,我們還需要為屬性(復雜屬性)定義狀態(tài)管理.

本身Control也有一套默認的狀態(tài)管理機制,而沒有實現(xiàn)IStateManager接口  ,

ASP.NET控件開發(fā)基礎之自定義視圖狀態(tài)管理其實現(xiàn)如下:

對下面代碼我認為是錯誤的,因為書上全是這么寫的,我認為因先把_viewState顯示轉(zhuǎn)換為IStateManager類型,

因為StateBag本身是繼承IStateManager接口,但MSDN中,我并沒看到其實現(xiàn)IStateManager的方法,而是顯示的實現(xiàn),當我用反射機制查看其方法時,卻又發(fā)現(xiàn)是有其方法的,但當你不把StateBag顯示轉(zhuǎn)換為IStateManager類型,而直接調(diào)用下面方法時,將會出錯.如果書上是對的,還請看到此文的人指點一下,對此我已經(jīng)疑惑很長時間了. 如果我是對的,那下面的_viewState因先顯示轉(zhuǎn)換為IStateManager類型,事實上我們都是這么做的.

  1. private StateBag _viewState;  
  2. protected virtual StateBag ViewState{  
  3.  get {  
  4.   if(_viewState != null)   
  5.   {  
  6.    return _viewState;  
  7.   }  
  8.   _viewState = new StateBag(ViewStateIgnoresCase);  
  9.   if(IsTrackingViewState)   
  10.    _viewState.TrackViewState();  
  11.    return _viewState;  
  12.  }  
  13. }  
  14.  
  15. protected virtual void TrackViewState(){   
  16.  if(_viewState != null) {   
  17.   _viewState.TrackViewState();  
  18.  }  
  19.  return null;  
  20. }  
  21.  
  22. protected virtual object SaveViewState(){  
  23.  if(_viewState != null) {  
  24.   _viewState.SaveViewState();   
  25.  }  
  26.  return null;  
  27. }  
  28. protected virtual void LoadViewState(object savedState){  
  29.  if(savedState != null) {   
  30.   ViewState.LoadViewState(savedState);   
  31.  }  

下面再看如何在Custom類中自定義屬性狀態(tài)管理,當你定義了復雜類型時,你就需要重寫上面的幾個方法.

ASP.NET控件開發(fā)基礎之自定義視圖狀態(tài)管理具體代碼如下:

首先我們對屬性進行視圖狀態(tài)的跟蹤,然后重寫了Control類的三個方法.其一方面調(diào)用了基類方法,一方面調(diào)用了Addres類的顯示接口方法.

Pair類為一個輔助類,用作存儲兩個相關對象的基本結(jié)構(gòu),下面根據(jù)調(diào)試結(jié)果來理解.在Custom類中對其三個方法設置斷點.

  1. public Address CustomAddress  
  2.         {  
  3.             get 
  4.             {  
  5.                 if (address == null)  
  6.                 {  
  7.                     address = new Address();  
  8.                     if (IsTrackingViewState)  
  9.                     {  
  10.                         ((IStateManager)address).TrackViewState();  
  11.                     }  
  12.                 }  
  13.                 return address;  
  14.             }  
  15.         }  
  16.  
  17. #region   
  18.         protected override void LoadViewState(object savedState)  
  19.         {  
  20.             Pair p = savedState as Pair;  
  21.             if (p != null)  
  22.             {  
  23.                 base.LoadViewState(p.First);  
  24.                 ((IStateManager)CustomAddress).LoadViewState(p.Second);  
  25.                 return;  
  26.             }  
  27.             base.LoadViewState(savedState);  
  28.         }  
  29.  
  30.         protected override object SaveViewState()  
  31.         {  
  32.             object baseState = base.SaveViewState();  
  33.             object thisState = null;  
  34.  
  35.             if (address != null)  
  36.             {  
  37.                 thisState = ((IStateManager)address).SaveViewState();  
  38.             }  
  39.  
  40.             if (thisState != null)  
  41.             {  
  42.                 return new Pair(baseState, thisState);  
  43.             }  
  44.             else 
  45.             {  
  46.                 return baseState;  
  47.             }  
  48.  
  49.         }  
  50.  
  51.         protected override void TrackViewState()  
  52.         {  
  53.             if (address != null)  
  54.             {  
  55.                 ((IStateManager)address).TrackViewState();  
  56.             }  
  57.             base.TrackViewState();  
  58.         }  
  59.         #endregion 

設置斷點以后,啟動起始頁開始測試.

啟動后第一步將會跳到Custom類的TrackViewState方法里面,執(zhí)行完此方法后IsTrackingViewState將設置為true,
從而可以繼續(xù)調(diào)用address的TrackViewState方法,另外可以看到address屬性為空值,然后按F5,通過此方法繼續(xù)

第二步將會跳到Custom類的SaveViewState方法里,發(fā)現(xiàn)baseState和thisState均為空,直接執(zhí)行基類方法.按F5繼續(xù)

第三步將會跳到Address類的TrackViewState方法里,_isTrackingViewState初始化時為false,執(zhí)行此方法后將賦值為ture,然后調(diào)用_viewState的TrackViewState方法.

初始化的工作就完成了,然后我們點擊確定按鈕,重新執(zhí)行.

重新跳到Custom類的TrackViewState方法里,步驟跟上面第一步一樣,按F5,繼續(xù)

跳到Address類的TrackViewState方法里,步驟跟上面第二步一樣,按F5繼續(xù)

跳到Custom類的SaveViewState方法里,此時address不再為null,此時會返回Pair構(gòu)造函數(shù).

然后會跳到Address類SaveViewState方法里,接著會跳回來,再執(zhí)行Custom類的SaveViewState方法

以上調(diào)試方法不一定正確,但多調(diào)用會理解的更深刻.

我們還發(fā)現(xiàn)并未跳到LoadViewState方法里,以前的主要工作就是保存視圖狀態(tài)更改,接下來再次調(diào)試的話,就會跳到LoadViewState方法方法里面,這時你會發(fā)現(xiàn)savedState就是SaveViewState方法中保存下來的視圖狀態(tài),可以看到其first和second值分別為Custom的頁面屬性和Address這個復雜屬性的值.

視圖狀態(tài)以鍵/值的方式保存,有一個屬性為Dirty,表示StateItem是否被修改過,可以通過SetDirty方法和SetItemDirty方法給StateItem添加Dirty標記.

  1. internal void SetDirty()  
  2. {  
  3.     _viewState.SetDirty(true);  

如果此StateItem標記為Dirty的話,則在SaveViewState方法中以鍵/值的方式保存到ArrayList中.

SaveViewState方法和LoadViewState方法執(zhí)行的是相反的操作.我們在頁面上看到的值,總是LoadViewState方法反序列化視圖狀態(tài).大家可以具體去了解StateBag類默認情況下SaveViewState方法和LoadViewState方法的實現(xiàn)過程.

當控件禁用視圖狀態(tài)時將不再執(zhí)行SaveViewState和LoadViewState,可以去調(diào)試一下就知道了.

還需要注意的是,我們了解視圖狀態(tài)可以保存的類型,其也是同過類型轉(zhuǎn)換器來轉(zhuǎn)換此類型,否則的話將以二進制串行化功能來串行化數(shù)值得,這樣降低了效率,所以我們還需要為其定義一個類型轉(zhuǎn)換器,第九篇的時候已經(jīng)講過怎么定義了,這里就不列代碼了,只是需要注意就是.

此外ASP.NET中加入了控件狀態(tài),因為視圖狀態(tài)要么全開,要么全禁用,控件狀態(tài)則是為彌補這一點,大家可以看MSDN,也可參考相關文章.

asp.net2.0中還可以對視圖狀態(tài)進行分塊處理,你需要在web.config里如下設置

  1. ﹤system.web﹥  
  2.     ﹤pages maxPageStateFieldLength="1000" ﹥  
  3. ﹤system.web﹥ 

ASP.NET還加入了視圖狀態(tài)持久性機制,大家可以在博客園參考相關文章,這里就當了解下有這種機制存在.

好了,就寫到這里,個人認為視圖狀態(tài)是很重要的,下面很多東西都要涉及到它,所以要好好理解這個東西.

寫的比較亂,對視圖狀態(tài)我真的比較敏感,很難理解,也難表達,可能很多地方寫錯,還請指出,這樣才能提高。

ASP.NET控件開發(fā)基礎之自定義視圖狀態(tài)管理的相關內(nèi)容就向大家介紹到這里,希望對你了解ASP.NET控件開發(fā)基礎之自定義視圖狀態(tài)管理有所幫助。

【編輯推薦】

  1. ASP.NET控件開發(fā)基礎之自定義控件樣式屬性淺析
  2. ASP.NET控件開發(fā)基礎之復合控件淺析
  3. ASP.NET控件開發(fā)基礎之復合控件事件處理淺析
  4. ASP.NET控件開發(fā)基礎之類型轉(zhuǎn)換器淺析
  5. ASP.NET控件開發(fā)基礎之實現(xiàn)控件集合屬性
責任編輯:仲衡 來源: 博客園
相關推薦

2009-08-06 09:18:01

ASP.NET自定義控ASP.NET控件開發(fā)

2009-08-06 17:52:45

ASP.NET控件開發(fā)自定義控件

2009-07-28 09:32:41

ASP.NET自定義控

2009-07-31 10:23:09

ASP.NET源碼DateTimePic

2011-04-19 10:33:16

ASP.NET自定義控

2009-08-10 14:16:59

ASP.NET自定義控

2009-08-06 17:13:56

ASP.NET自定義控

2011-07-12 15:03:28

2009-08-04 15:13:38

2009-08-01 12:00:15

ASP.NET服務器自ASP.NET服務器ASP.NET

2009-08-05 17:58:53

自定義集合ASP.NET 2.0

2009-08-10 16:58:45

ASP.NET安裝部署

2009-08-06 13:08:23

ASP.NET控件開發(fā)

2009-08-06 15:21:45

ASP.NET控件開發(fā)RenderConte

2009-08-06 18:18:27

ASP.NET控件開發(fā)ASP.NET復合控件

2011-05-19 10:16:27

ASP.NET

2009-08-04 13:35:16

ASP.NET自定義樣

2009-08-07 13:31:41

ASP.NET控件開發(fā)

2011-09-08 13:56:41

ASP.NET性能

2009-08-07 14:42:02

ASP.NET控件開發(fā)
點贊
收藏

51CTO技術(shù)棧公眾號