2009-07-21 19 views
4

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

  1. あなたはStateBagそれを与えることなくattributeCollectionを作成できません:以下

    
    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; 
        } 
    } 
     
    

    注:

    WebBrowserコントロールは、このような属性のプロパティを実装します。

  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

+0

遅い返信をおかけして申し訳ありません。私は私の答えを更新しました。 – womp

+0

悲しいですが、私は実際にインターフェイスの隠蔽によって混乱しました。私はインターフェイスを明示的に実装していませんでしたが、内部的にできることから推測してください。私を真っ直ぐにしてくれてありがとう – drs9222

関連する問題