探讨ASP.NET 2.0中的Web控件改进技术(2)
生活随笔
收集整理的這篇文章主要介紹了
探讨ASP.NET 2.0中的Web控件改进技术(2)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
我的觀點是:ViewState有可能成為你最好的朋友,也有可能成為你最壞的敵人—這要依賴于你使用它的方式來決定。如果你在以前曾經使用過ViewState,那么,你肯定會喜歡新的ControlState。 關于ViewState的最令人頭痛的問題之一就是,它的“all-or-nothing”狀態管理方法。頁面開發者可以很容易地決定在任何控 件級,頁面級或在整個站點級(經由web.config)上關閉ViewState。事實上,如果你在整個站點級上通過web.config關閉 ViewState的話,那么,你不妨猜測一下你還能夠在其它什么地方關閉它?答案是:還可以在machine.config中實現—在此情況下,它能夠 影響到同一服務器上的所有站點。如果一個頁面開發者決定關掉在ViewState中實現狀態管理的能力,那么,你的控件生成有可能出現部分不可用,或更有 甚者—完全不可用。 為此,在新版本中,微軟創建了ControlState—旨在解決這一問題。頁面開發者不能關掉ControlState,因此使用它進行屬性選擇更為安全。 使用ControlState與使用ViewState幾乎完全一致。然而,ControlState并沒有提供象ViewState這樣的一 個變量,而是提供了稱為SaveControlState和LoadControlState的方法以便于你的控件能夠進行重載。這些方法與 SaveViewState和LoadViewState方法的工作原理完全一致。 因為ControlState在屬性語句中沒有提供一個相應的變量,所以,你必須借助于ASP.NET開發者以前在他們的對象中所使用的成員變量(屬性語句)來實現相同的功能。
然而,因為我使用了一個標準的成員變量來保存值,所以我需要一種方法以便把數據存儲在ControlState中—這正是前面提到的方法“登 場”的原因。就象在它們相應的ViewState方法中那樣,ASP.NET將在頁面生命周期內調用這兩個方法。其中,SaveViewState方法返 回一個將被持久存儲的對象類型。通過返回一個對象數組,這個方法可以存儲多個值。并且,就象發生在SaveViewState方法中一樣,也是使用數組的 0下標元素來調用基類的SaveControlState方法。
注意:LoadControlState方法以一個對象作為參數—這個對象是以前在SaveControlState中返回的一個對象。在這個 方法中,我重新分配了成員變量—通過把該參數轉換為一個對象數組,然后獲得每個下標的值。與以前一樣,我使用數組的0下標來調用基類的 LoadControlState方法。
借助于這些方法來存儲數據,在頁面開發者關掉ViewState時,控件就不會出現前面那些麻煩。 你可能對ControlState的存儲位置感到驚訝;它對應于另一個生成到HTML頁面中的隱藏的文本框。就象在ViewState情況下數 據被存儲在__ViewState隱藏文本框中類似,ASP.NET 2.0使用__ControlState隱藏文本框來存儲ControlState數據。 遺憾的是,微軟沒有向開發者提供內在地使用ControlState的能力—就象在ViewState情況下那樣。所以,為了 ControlState使用,你需要注冊你的控件。你可以重載控件的OnInit事件并且調用Page對象的 RegisterRequiresControlState方法。
現在,你可以使用ControlState來存儲你認為足夠重要的數據—如果不把它存儲起來,那么你的控件可能生成一些無用的內容。 記住,你在設計時刻對屬性的修改將被硬編碼到該控件的ASPX聲明中,從而在相鄰的再次回寄之間自動地存儲。然而,如果表單上的一個行為改變了 一個控件的屬性,那么,這將會激活狀態管理機制的使用。如果不把該屬性存儲在一個狀態中,那么,在下一次回寄時它將恢復到“硬編碼”狀態。 現在,總的來看,我們應該把與外觀相關的屬性存儲在ViewState中,而把與行為相關的屬性存儲在ControlState中。通過這種方式,如果一個頁面開發者關掉ViewState,那么你的控件盡管可能看起來樣子別扭,但是仍能正確工作。
| 以下是引用片段: Protected?_MailServer?As?String?=?"First?name:" Public?Property?MailServer()?As?String Get Return?_?MailServer End?Get Set(ByVal?value?As?String) _MailServer?=?value End?Set End?Property |
| 以下是引用片段: Protected?Overrides?Function?SaveControlState()?As?Object Dim?state()?As?Object?=?New?Object(2)?{} state(0)?=?MyBase.SaveControlState() state(1)?=?_MailServer Return?state End?Function |
| 以下是引用片段: Protected?Overrides?Sub?LoadControlState(?_ ByVal?savedState?As?Object) If?savedState?IsNot?Nothing?Then Dim?state()?As?Object?=?CType(savedState,?Object()) MyBase.LoadControlState(state(0)) _MailServer?=?CType(state(1),?String) End?If End?Sub |
| 以下是引用片段: Protected?Overrides?Sub?OnInit(ByVal?e?As?System.EventArgs) MyBase.OnInit(e) If?Page?IsNot?Nothing?Then Page.RegisterRequiresControlState(Me) End?If End?Sub |
總結
以上是生活随笔為你收集整理的探讨ASP.NET 2.0中的Web控件改进技术(2)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我们在雪地撒野——51cto众人滑雪图片
- 下一篇: 将cpu集成在一块芯片上所形成的元器件称