2009-07-21 75 views
4

讓我們假裝出於某種原因,我想創建一個派生自Control而不是WebControl的自定義控件。讓我們假設我需要處理屬性(即實現IAttributeAccessor),並且我想通過像WebControl一樣使用AttributeCollection來實現。ASP.NET StateBag和自定義控件

WebControl的實現Attributes屬性是這樣的:


public AttributeCollection Attributes 
{ 
    get 
    { 
     if (this.attrColl == null) 
     { 
      if (this.attrState == null) 
      { 
       this.attrState = new StateBag(true); 
       if (base.IsTrackingViewState]) 
       { 
        this.attrState.TrackViewState(); 
       } 
      } 
      this.attrColl = new AttributeCollection(this.attrState); 
     } 
     return this.attrColl; 
    } 
} 
 

注意以下幾點:

  1. 你不能沒有給它一個StateBag的創建AttributeCollection。
  2. 我們必須創建一個新的StateBag。重用控件的StateBag並不明智,因爲屬性可能具有名稱作爲控件存儲的值。
  3. 我們無法在StateBag上調用TrackViewState,因爲這是一種內部方法。
  4. StateBag是一個密封的類。

因此,據我瞭解,如果我想使用AttributeCollection,我必須使用一個新的StateBag,它永遠不會(不訴諸像反射這樣的技巧)實際上正確地管理狀態。

我錯過了什麼嗎?

回答

3

要在自定義StateBag上調用TrackViewState,必須將其轉換爲其接口。

StateBag mybag = new StateBag(); 
(mybag as IStateManager).TrackViewState(); 

我猜這個設計決定是爲了隱藏消費者ViewState的實現。有關於在documentation page for IStateManager上執行自定義狀態跟蹤的一些信息。

+0

這是一個調用StateBag的TrackViewState,它是內部的。 – drs9222 2009-07-22 00:03:03