В какой момент 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?

Другие вопросы по тегам