對於asp.net開發者,尤其是對控件開發感興趣的朋友來說,視圖狀態絕對是個讓人頭痛的問題.一直以來,我都很困惑,在網上尋覓了很久,這兩天才稍稍有了些眉目. 再鑒於本人一直潛水,因此決定今天就冒第一個泡泡吧.
當我們從Control或者WebControl派生新的控件時,我們不用定義ViewState屬性就可以使用改屬性了,因此它應該是派生下來的.當我們用reflector查看下源代碼就可以知道,它位於Control中.
protected virtual StateBag ViewState { get { . } set { } }
這裡又出現了一個StateBag新類型,它又是什麼什麼東西呢?我們還是從源代碼入手:
StateBag來自於System.Web.UI,它的聲明如下:
public sealed class StateBag : IStateManager, IDictionary, ICollection, IEnumerable ............
這裡我們重點要關注的是IStateManager,因為在我們為自己的自定義控件定制視圖狀態管理時就需要從這個接口派生.但這次我先不討論它
從名字上來說,我們大致可以認為它是一個容器,一個裝'State'的容器.
下面讓我們看看StateBag的實現:
private IDictionary bag; private bool marked; public StateBag(bool ignoreCase) { this.marked = false; this.ignoreCase = ignoreCase; this.bag = this.CreateBag(); } private IDictionary CreateBag() { return new HybridDictionary(this.ignoreCase); }