В какой момент ViewState отображается на сеанс страницы?
Я пытаюсь понять порядок событий здесь.
Эта страница сообщает мне, что в какой-то момент жизненного цикла страницы ViewState отображается на сеанс страницы.
Я предполагаю, что это происходит в контроле. Метод SaveViewState().
Может кто-нибудь скажет мне, когда это произойдет?
Я обеспокоен тем, что вижу некоторый код, который читает переменные ViewState в Page_Load, и я думаю, что он по-прежнему возвращает информацию даже после очистки сеанса. (вызывает проблемы с настроенным нами перенаправлением тайм-аута)
2 ответа
ViewState восстанавливается между Init и Load1 и сохраняется после PreRender. Таким образом это действительно для использования в Load через PreRender.
Тем не менее, ViewState != Session
, ViewState связан с формой страницы, а не сессией, поскольку он живет в скрытом __VIEWSTATE
поле2. Таким образом, если иное не "очищено" при обнаружении тайм-аута сеанса, он по-прежнему будет публиковать сохраненные на стороне клиента значения (которые могут быть часами или днями;-) на следующем пост-возврате.
1 На самом деле можно получить доступ к ViewState в PreLoad, который доступен для страницы, но не для общих элементов управления. LoadViewState/TrackViewState выполняется после инициализации страницы по умолчанию. (Инициация страницы осуществляется после инициализации всех элементов управления, находящихся в настоящее время в иерархии.)
2 Я считаю, что использование формы - единственный правильный способ обработки ViewState. Тем не менее, он может быть сохранен / загружен с использованием другой поддержки (например, на стороне сервера).
Во-первых, инициализируйте ViewState
в вашей странице загрузки. Установите BreakPoints на каждой странице событий, как указано ниже.
Теперь начните отладку по нажатию кнопки на каждом событии.
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
ViewState["abc"] = "10";
}
}
protected override void OnPreInit(EventArgs e)
{
base.OnPreInit(e);
}
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
}
protected override void OnInitComplete(EventArgs e)
{
base.OnInitComplete(e);
}
protected override void OnPreLoad(EventArgs e)
{
base.OnPreLoad(e);
}
OnPreLoad
начнет давать вам постоянное значение ViewState. Перед этим событием вроде Init/InitComplete/PreInit не будет никакого значения ViewState.
Когда происходит обратная передача, SaveViewState()
захватит новое значение и LoadViewState()
будет заселять его после обратной передачи.
Почему вы сравниваете сессию с ViewState?