Как отключить ViewState на страницах ASP.NET

Всем ASP.NET разработчикам известно, что Microsoft по совершенно непонятным причинам для всех эелементов на странице по умолчанию прописывает EnableViewState = true, как результат, огромный ViewState (который хранит hash-ы состояний aspx страниц), который никак не используется, а только безбожно жрет траффик.

Можно, конечно, помучаться и пописать для каждого серверного элемента ручками EnableViewState = false, и это в разы сократит объемы ViewState, но он все-таки будет создавать некоторое количество ненужного траффика для посетителя.

И вот недавно нашлось решение, как ViewState отключить полностью: необходимо переопределить 2 метода у базового класса страниц PageBase:

protected override void SavePageStateToPersistenceMedium(object state)
{
}
protected override object LoadPageStateFromPersistenceMedium()
{
return null;
}

В результате получается вполне приличный результат:

‹input name="__VIEWSTATE" id="
__VIEWSTATE" type="hidden" /›

Нашел в блоге у одного из ASP.NET разработчиков Дмитрия Дмитриева: http://progblog.ru/Posts/DisableViewState

Leave a comment

10 Comments

  1. Arcon

     /  10.05.2009

    Спасибо! Очень пригодилось!

    Ответить
  2. А не пробовали для всей страницы вью-стэйт отключать, а там где надо — включать?
    <%@ Page EnableViewState="false" %>
    Примерно так

    Ответить
  3. Alex

     /  20.10.2009

    Ну на счет полного отключения ViewState я не очень согдасен тем более перекрытиме методов страницы.
    Почему?
    Ответ прост, есть задача, создать модуль с разрешением параллелизма. Ну типа одну и туже статью редактируют два манагера, после запроса из БД.
    1. Модель оптимистической блокировки типа кто последний тот и прав отпадает, так как после окончания редактирования кто-то из манагеров первым зафиксировал изменения, второй манагер через пару минут тоже зафиксировал изменения. Получается, что у первого манагера труд даром прошел. Отсюда вывод нужно сделать так чтобы у второго манагера не прошли изменения с вывиской что мол уже отредактировано, ранее после получения Вами данных и тут-же идет загруз результата работы первого манагера. Второй манагер уже думает а стоит ли ему что то менять, если да то его труд тоже должен быть сохранен и желательно без доп источника типа таблицы и XML, где будем сохранять работу второго манагера (ViewState) и как решить эту проблему в WinForms нет проблем, а вот в Web?

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

    Ответить
  4. "Alex: где будем сохранять работу второго манагера"
    Честно говоря, не вижу проблемы:

    0. имеем в таблице поле datetime LastUpdated
    1. при открытии текста на редактирование считываем LastUpdated
    2. при Update проверяем что LastUpdated в базе эквивалентен LastUpdated редактируемого сервера, в случае несовпадения возвращаем код ошибки, LastUpdated из базы (заменяем ранее прочитанный LastUpdated) и текст отредактированной более шустрым манагером статьи
    3. Выводим пользователю сообщение об ошибке сохранения, окно редактора не закрываем и рядом с textarea в котором манагер правит тест выводим текст введенный шустрым конкурентом. Ну или наоборот – текст текущего менеджера в div а текст шустрого в textarea.

    Ответить
  5. Все оказалось очень просто. Спасибо

    Ответить
  6. это в разы сократит объемы ViewState, но он все-таки будет создавать некоторое количество ненужного траффика для посетителя.

    Ответить
  7. как ViewState отключить полностью: необходимо переопределить 2 метода у базового класса страниц PageBase:

    Ответить
  8. окно редактора не закрываем и рядом с textarea в котором манагер правит тест выводим текст введенный шустрым конкурентом. Ну или наоборот – текст текущего менеджера в div а текст шустрого в textarea.

    Ответить
  9. Exclusive

     /  18.03.2011

    У меня ниче не отключилось… как оставались значения, так и остаются… затрахал уже этот ASP.NET(((

    Ответить

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>