Минимизация viewstate - путается с `EnableViewState` и` ViewStateMode` в asp.net 4.0 - PullRequest
17 голосов
/ 30 марта 2011

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

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

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

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

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

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

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

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

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

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

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

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

1 Ответ

14 голосов
/ 05 апреля 2011

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

...