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;
}
}
注意以下幾點:
- 你不能沒有給它一個StateBag的創建AttributeCollection。
- 我們必須創建一個新的StateBag。重用控件的StateBag並不明智,因爲屬性可能具有名稱作爲控件存儲的值。
- 我們無法在StateBag上調用TrackViewState,因爲這是一種內部方法。
- StateBag是一個密封的類。
因此,據我瞭解,如果我想使用AttributeCollection,我必須使用一個新的StateBag,它永遠不會(不訴諸像反射這樣的技巧)實際上正確地管理狀態。
我錯過了什麼嗎?
這是一個調用StateBag的TrackViewState,它是內部的。 – drs9222 2009-07-22 00:03:03