ASP.NET StateBag и пользовательские элементы управления - PullRequest
5 голосов
/ 21 июля 2009

Предположим, что по какой-то причине я хочу создать пользовательский элемент управления, производный от Control, а не от WebControl. Давайте также предположим, что мне нужно обработать атрибуты (т.е. реализовать IAttributeAccessor) и что я хочу сделать это, используя AttributeCollection, как это делает WebControl.

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. Вы не можете создать коллекцию AttributeCollection, не присвоив ей StateBag.
  2. Мы должны создать новый StateBag. Не следует повторно использовать элементы управления StateBag, поскольку атрибут может иметь имя в качестве значения, сохраненного элементом управления.
  3. Мы не можем вызвать TrackViewState для StateBag, потому что это внутренний метод.
  4. StateBag - это запечатанный класс.

Итак, насколько я понимаю, если я хочу использовать коллекцию AttributeCollection, мне нужно использовать новый StateBag, который никогда (без использования трюков, таких как отражение) не сможет правильно управлять состоянием.

Я что-то упустил?

1 Ответ

3 голосов
/ 21 июля 2009

Чтобы вызвать TrackViewState для пользовательского StateBag, вы должны привести его к его интерфейсу.

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

Я предполагаю, что это дизайнерское решение было принято, чтобы скрыть реализацию ViewState от потребителей. Некоторая информация о реализации пользовательского отслеживания состояния на странице документации для IStateManager .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...