Как мне выключить viewstate навсегда? - PullRequest
15 голосов
/ 15 марта 2009

Исходя из фона PHP, я люблю использовать чистые URL для передачи данных из одного сервиса в другой.

Однако в некоторых моих проектах ASP.NET я получаю ужасный параметр ViewState в своих URL-адресах.

Есть ли способ отключить это глобально?

Как это повлияет на мое приложение ASP.NET?

Ответы [ 6 ]

35 голосов
/ 15 марта 2009

Вы можете отключить режим просмотра для всего сайта следующим образом:

    <system.web>
<pages enableViewState="false" />

Тем не менее, вы не должны получать это в URL. ViewState - это скрытое поле, которое отправляется на сервер с обратной передачей (которая обычно использует запись). Он сохраняет состояние элементов управления при визуализации страницы клиенту, отправляя ее при каждой обратной передаче. Если это работает для приложения, вы можете вместо этого переключиться на использование post (в форме задачи обязательно используется get), если нет, взгляните на ответ Джона.

Проверьте эту ссылку для получения дополнительной информации о том, как viewstate вписывается в жизненный цикл asp.net: http://msdn.microsoft.com/en-us/library/ms972976.aspx.

10 голосов
/ 15 марта 2009

У меня был похожий вопрос при написании Reputation Tracker .

Я не знаю, как вы делаете это глобально, кроме того, что никогда не используете форму с набором runat="server", что больше связано с дисциплиной, чем с сеттингом. В частности, если в форме установлено runat="server", я полагаю, что вы всегда получите параметр viewstate, даже если вы его везде выключили, поэтому вы не получите значений . Так или иначе, это был мой опыт.

Очевидно, это несколько ограничивает вас, но я обнаружил, что использование серверных элементов управления HTML (вместо элементов управления ASP.NET) для соответствующих частей ASP.NET может значительно упростить понимание жизни.

8 голосов
/ 24 октября 2012

По умолчанию отключите ViewState, используя элемент <page> в файле web.config. Использование EnableViewState="true" в директиве @Page больше не будет работать, если вы отключите ViewState в web.config. Если позже вы решите, что вам нужен ViewState для конкретной страницы, вы можете включить его только для этой страницы, используя элемент <location>.

<configuration>
  <system.web>
    <pages enableViewState="false" />
  </system.web>

  <location path="MyFolder/MyPage.aspx">
    <system.web>
      <pages enableViewState="true" />
    </system.web>
  </location>
  <location path="Site.master">
    <system.web>
      <pages enableViewState="true" />
    </system.web>
  </location>
</configuration>

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

4 голосов
/ 15 марта 2009

Добавьте это в файл web.config:

<Pages enableViewState="false"/> 
3 голосов
/ 15 марта 2009

Вы можете переключиться на ASP.Net MVC. Насколько я понимаю, он не использует ViewState.

2 голосов
/ 15 марта 2009

Напомним, однако, что некоторые поведения, ожидаемые большинством разработчиков веб-форм ASP.NET, не будут работать без ViewState. Цель ViewState - создать иллюзию того, что различные свойства страниц и элементов управления сохраняются от одного запроса к другому. ViewState содержит не все свойства элемента управления, только те, которые были изменены. Идея состоит в том, что ViewState сохраняет эти свойства такими, какими они были на момент последнего отображения формы.

Один хороший пример - это событие SelectedIndexChanged в раскрывающемся списке (событие, для которого не установлена ​​автопостбэк). Это работает, потому что ViewState сохраняет предыдущий индекс, а форма публикует текущий индекс, а элемент управления сравнивает их, чтобы узнать, что выбранный индекс изменился. Вот когда это вызывает событие SelectedIndexChanged. Без ViewState это событие не сработает. То же самое для TextChanged событий и т. Д.

В отсутствие ситуации GET (с которой я никогда не сталкивался), большая проблема с ViewState - использовать его там, где он не нужен. Элементу управления сеткой не нужно сохранять предыдущие значения всех элементов управления во всех его строках, поэтому не включайте ViewState для него.

...