Asp.net Свойства базовой страницы, использующие ViewState, удаляются при обратной передаче
-
06-07-2019 - |
Вопрос
Вот основы моей настройки:
У меня есть класс BasePage, который наследуется от System.Web.UI.Page.Базовая страница имеет два свойства, реализованные таким образом, что их получение / набор выполняется из двух разных элементов в коллекции ViewState (например, this.ViewState["Year"] из базовой страницы).
У меня есть другой класс, который затем наследуется от BasePage, давайте назовем его SpecificBasePage .
Наконец, у меня есть aspx-страница, которая наследует SpecificBasePage .
Я добавил точки останова и проделал много пошаговых действий в своем коде и обнаружил, что при начальной загрузке страницы обоим моим свойствам состояния просмотра присваиваются значения, и эти значения сохраняются на протяжении всего первого жизненного цикла загрузки страницы.
Однако, когда страница публикуется обратно, во время события Page_Load и других обработчиков событий (когда должно быть загружено ViewState), оба свойства возвращают значение null.Проверка этого.ViewState.Количество показывает, что в коллекции нет объектов.
Кто-нибудь может подумать о том, что я мог бы где-то делать, что повлияло бы на состояние просмотра и вызвало бы такое поведение?
--Дополнение Я выделил его в часть своего кода.При начальной загрузке я даю значения свойств viewstate в OnInit, я обнаружил, что когда я перемещаю это в OnLoad, значения сохраняются во всей обратной публикации.Я предполагаю, что даже при том, что добавленные значения состояния просмотра сохраняются на протяжении всего начального жизненного цикла страницы, они отбрасываются в обратной публикации?
Решение
Страницы могут иметь EnableViewState = false в aspx
Также может быть отключен в web.config приложения или даже для всего компьютера на элементе .
Обновление 1: В жизненном цикле asp.net ViewState загружается после инициализации и перед загрузкой Подробная информация.Смотрите на это так, как будто все, что находится в init, считается частью объявления страницы.Позже asp.net загрузит viewstate, и после этого начнет отслеживать изменения в viewstate.Именно после этого asp.net будет видна любая разница между исходной информацией в viewstate и измененной информацией, поэтому перемещение ее в режим загрузки позволяет избежать проблемы (поскольку начального состояния там нет, а новое состояние - это то, что вы поместили в viewstate).По ссылке выше:
"Причина в том, что класс StateBag отслеживает изменения только в своих членах после того, как был вызван его метод TrackViewState() .То есть, если у вас есть Пакет состояния, любые дополнения или модификации, которые были сделаны до Созданный TrackViewState() не будет сохранен при вызове метода SaveViewState() .Метод TrackViewState() вызывается в конце этапа инициализации, который происходит после этапа создания экземпляра.Следовательно, начальное свойство назначения на этапе создания экземпляра — при записи в ViewState в средствах доступа к набору свойств — не сохраняются во время вызова метода SaveViewState() в сохраните этап состояния просмотра, потому что Метод TrackViewState() еще не был вызван".
Другие советы
Вот отличный ответ, который другой пользователь опубликовал о ASP.NET жизненный цикл страницы стоит обратить внимание на проблемы с ViewState.
Кроме того, взгляните на "По-настоящему понимающий ViewState"
Как я уже говорил в части, которую я добавил позже, по-видимому, вы не можете ничего установить в состоянии просмотра перед загрузкой страницы, ДАЖЕ ЕСЛИ Asp.net не выдает ошибку, и она будет существовать в состоянии просмотра на протяжении всего начального жизненного цикла страницы, она НЕ будет сохраняться в последующем жизненном цикле обратной публикации.
Взгляните на то, где вы устанавливаете значения ViewState.Возможно, подключите ваше событие OnUnload и проверьте объект ViewState, просто чтобы убедиться, что значения действительно устанавливаются.