Rose debug info
---------------

Как отключить 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

11 комментариев
Arcon 2009

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

Игорь 2009

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

Alex 2009

Ну на счет полного отключения ViewState я не очень согдасен тем более перекрытиме методов страницы.
Почему?
Ответ прост, есть задача, создать модуль с разрешением параллелизма. Ну типа одну и туже статью редактируют два манагера, после запроса из БД.

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

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

Blush 2010

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

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

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

    Cordless Drills - Makita Drill 2010

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

    dental implant dentist 2010

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

    Used Auto Parts 2010

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

    Exclusive 2011

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

    admin 2011

    Ага. Попробуйте перейти на MVC 2 или MVC 3 Asp.Net

    51oma 2012

    Иногда нельзя просто отключить ViewState, например, когда нам все-таки необходимо хранить данные о сессии. Тогда можно изменит способ хранения данных, хранить не на странице, а в сессии на сервере веб-приложения. http://stud-work.ru/index.php/kak-udalit-viewstate-so-stranitsy