Свойства Asp.net BasePage, использующие ViewState, очищаются при обратной передаче

Вот основы моей настройки:

У меня есть класс BasePage, который наследуется от System.Web.UI.Page. BasePage имеет два реализованных свойства, так что их получение / установка выполняется из двух разных элементов в коллекции ViewState (например, this.ViewState ["Year"] из BasePage).

У меня есть еще один класс, который затем наследуется от BasePage, назовем его SpecificBasePage.

Наконец, у меня есть страница aspx, которая наследует SpecificBasePage.

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

Однако, когда страница отправляется обратно, во время события Page_Load и других обработчиков событий (когда ViewState должен быть загружен), оба свойства возвращают значение null. Проверка this.ViewState.Count показывает, что в коллекции нет объектов.

Может ли кто-нибудь придумать, что я где-то делаю, что повлияет на ViewState и вызовет такое поведение?

- Дополнение Я изолировал его от части своего кода. При начальной загрузке я даю значения свойств viewstate в OnInit, я обнаружил, что когда я перемещаю это в OnLoad, значения сохраняются в посте. Я предполагаю, что даже если добавленные значения состояния представления сохраняются на протяжении всего жизненного цикла начальной страницы, они заброшены в обратной публикации?


person spilliton    schedule 09.03.2009    source источник


Ответы (4)


Страницы могут иметь EnableViewState = false в aspx

Также может быть отключен в web.config приложения или даже для всего компьютера в элементе.

Обновление 1: в жизненном цикле asp.net ViewState загружается после инициализации и до загрузки дополнительная информация. Смотрите, как будто все, что находится в init, считается частью объявления страницы. Позже asp.net загрузит состояние просмотра и после этого начнет отслеживать изменения состояния просмотра. Именно после этого asp.net увидит любую разницу между исходной информацией о состоянии просмотра и измененной информацией, поэтому перемещение ее для загрузки позволяет избежать проблемы (поскольку начального состояния нет, а новое состояние - это то, что вы поместили в состояние просмотра) . По ссылке выше:

"Причина в том, что класс StateBag отслеживает изменения в своих членах только после того, как был вызван его метод TrackViewState (). То есть, если у вас есть StateBag, любые и все добавления или изменения, сделанные до того, как TrackViewState () будет произведен, не будут будут сохранены при вызове метода SaveViewState (). Метод TrackViewState () вызывается в конце этапа инициализации, который происходит после этапа создания экземпляра. Следовательно, начальные назначения свойств на этапе создания экземпляра - при записи в ViewState в аксессоры набора свойств - не сохраняются во время вызова метода SaveViewState () на этапе сохранения состояния просмотра, потому что метод TrackViewState () еще не был вызван ".

person eglasius    schedule 09.03.2009
comment
Спасибо за ответ. Я провел широкий поиск по проекту EnableViewState, и у меня было несколько элементов управления, но ни одного на этой странице, и ни одного в файле web.config - person spilliton; 09.03.2009

Вот отличный ответ, который еще один пользователь написал о Жизненный цикл страницы ASP.NET стоит обратить внимание на проблемы с ViewState.

Также обратите внимание на "Истинное понимание ViewState "

person Gavin Miller    schedule 09.03.2009

Как я сказал в части, которую я добавил позже, по-видимому, вы не можете ничего установить в состоянии просмотра перед загрузкой страницы, ДАЖЕ, ЧТО Asp.net не выдает ошибку, и он будет существовать в состоянии просмотра на протяжении всего начального жизненного цикла страницы. , он НЕ будет сохраняться в течение последующего жизненного цикла обратной публикации.

person spilliton    schedule 09.03.2009

Посмотрите, где вы устанавливаете значения ViewState. Возможно, подключите свое событие OnUnload и проверьте объект ViewState, чтобы убедиться, что значения действительно устанавливаются.

person andleer    schedule 09.03.2009