让我们假装由于某种原因,我想创建一个自控件而不是WebControl派生的自定义控件。让我们还假设我需要处理属性(即实现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; }}
请注意以下几点:

  • 如果不给它提供StateBag,则无法创建AttributeCollection。
  • 我们必须创建一个新的StateBag。重用控件StateBag是不明智的,因为属性的名称可能是控件存储的值。
  • 我们不能在StateBag上调用TrackViewState,因为这是一个内部方法。
  • StateBag是一个密封的类。

  • 因此,据我了解,如果我想使用AttributeCollection,则必须使用新的StateBag,该StateBag永远无法(不依靠反射之类​​的技巧)真正正确地管理状态。

    我想念什么吗?

    最佳答案

    要在自定义StateBag上调用TrackViewState,必须将其强制转换为它的接口(interface)。

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

    我猜想这个设计决定是为了向消费者隐藏ViewState的实现。有关在documentation page for IStateManager上实现自定义状态跟踪的一些信息。

    关于c# - ASP.NET StateBag和自定义控件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1160442/

    10-10 16:36