Минимизация viewstate - путается с «EnableViewState» и «ViewStateMode» в asp.net 4.0

17

Я пытаюсь очистить старый сайт ASP.NET WebForms, в котором ViewState включен везде. Это проблема производительности - огромные состояния просмотра вызывают заметные задержки при отправке. Но большинству форм не требуется ViewState, за исключением некоторого сложного элемента управления & amp; данные формы. Даже формы без элементов управления вводом генерируют большие представления, потому что я думаю, что asp.net хранит все виды метаданных о каждом отдельном элементе управления сервером. Но состояние видимости и т. Д. Все контролируется в коде, поэтому я думаю, что могу многое устранить.

Довольно обременительно добавлять EnableViewState="false" к каждому отдельному элементу управления (на странице и созданному в коде), который ему не нужен, поэтому я пытаюсь отключить его на уровне страницы / элемента управления и выборочно включить его для вещей, которые в этом нуждаются. (Да, я понимаю, что это рискованно, но на самом деле есть только пара больших форм и пара шаблонов, которые, если их решить, будут иметь большое значение).

Вот что я не совсем понимаю.

Если элемент управления или страница имеет EnableViewState="false" , это дескриптор <%.. %> или его тег, где он создается на родительской странице, все нарушается, потому что любые данные ViewState, добавленные в код, не работают. Таким образом, я, кажется, могу оставить его включенным на уровне элемента управления, но для EnableViewState установить значение false для элемента управления оболочки в каждом контейнере, а затем установить ViewStateMode=true (который переопределяет это) на уровне элемента управления. p>

То, что я не получаю, это то, что происходит, когда:

ViewStateMode = ViewStateMode.Enabled и EnableViewState = false для элемента управления, который содержит другие элементы управления.

для контроля. Можно ли включить внутренние элементы управления еще с ViewStateMode ? В основном, какие настройки имеют последнее слово, когда они конфликтуют?

Для каждого контейнера я хочу иметь возможность отключить все в элементе управления оберткой, но при этом убедиться, что:

1) Настройки ViewState в коде работают и

2) ViewState отключен для всех элементов управления по умолчанию и

3) Я могу выборочно включить ViewState для элементов управления.

Это кажется смешным. Если у меня есть элемент управления оберткой на главной странице, для которого установлено значение EnableViewState="false" , но затем для субконтроля установлено значение ViewStateMode="Enabled" , оно нарушается. Согласно MS, ViewStateMode должен заменить любые внешние настройки ViewState, но, похоже, он не работает.

    
задан Jamie Treworgy 30.03.2011 в 13:46
источник
  • Этот вопрос очень легко ответить, если вы дадите одну ключевую информацию: какая версия ASP.NET? –  Andrew Barber 30.03.2011 в 14:13
  • Извините! Asp.net 4.0. –  Jamie Treworgy 30.03.2011 в 14:30

1 ответ

14

Согласно статье MSDN о ViewStateMode ,% Значение co_de% имеет значение только когда ViewStateMode . Чтобы достичь желаемого, вам нужно оставить EnableViewState="true" на элементе управления, а затем обернуть подэлементы основного элемента в ViewStateMode="Enabled" , который имеет asp:Placeholder . Таким образом, вы все еще можете манипулировать ViewState в codebehind, но ни у одного дочернего элемента управления не будет ViewState (кроме тех, которые вы явно указали, чтобы иметь его через ViewStateMode="Disabled" ).

    
ответ дан Dan Davies Brackett 05.04.2011 в 19:14
  • Спасибо. Я понял это после некоторой путаницы и в основном установил ViewStateMode = «Enabled» для каждого элемента управления / страницы, установил его «Отключено» для обертки и снова установил его «Включено» только для определенных элементов управления. Кажется, что работает до сих пор, не слишком много сюрпризов, и количество мусора ViewState заметно уменьшается. –  Jamie Treworgy 05.04.2011 в 19:21