5

なんらかの理由で、WebControlではなくControlから派生したカスタムコントロールを作成したいとします。また、属性を処理する(つまり、IAttributeAccessorを実装する)必要があり、WebControlと同じようにAttributeCollectionを使用して処理したいとします。

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を使用する必要があることを理解しています。

私は何かが足りないのですか?

4

1 に答える 1

3

カスタムStateBagでTrackViewStateを呼び出すには、それをそのインターフェイスにキャストする必要があります。

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

この設計上の決定は、ViewStateの実装をコンシューマーから隠すために行われたと思います。IStateManagerのドキュメントページに、カスタム状態追跡の実装に関する情報がいくつかあります。

于 2009-07-21T19:13:19.677 に答える