让我们假装由于某种原因,我想创建一个自控件而不是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; }}
请注意以下几点:
因此,据我了解,如果我想使用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/