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

StackOverflow https://stackoverflow.com/questions/627049

Вопрос

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

У меня есть класс 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, просто чтобы убедиться, что значения действительно устанавливаются.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top