Это визуализация XML-lized вашей публикуемой ViewState:
<viewstate>
<Pair>
<Pair>
<String>1382774129</String>
</Pair>
</Pair>
</viewstate>
<controlstate>
<HybridDictionary>
<DictionaryEntry>
<String>__ControlsRequirePostBackKey__</String>
<ArrayList>
<String>ctl00$ContentPlaceHolder_MainContent$RadBut1</String>
<String>ctl00$ContentPlaceHolder_MainContent$RadBut1</String>
<String>ctl00$ContentPlaceHolder_MainContent$RadBut2</String>
<String>ctl00$ContentPlaceHolder_MainContent$RadBut2</String>
<String>ctl00$ContentPlaceHolder_MainContent$RadBut3</String>
<String>ctl00$ContentPlaceHolder_MainContent$RadBut4</String>
<String>ctl00$ContentPlaceHolder_MainContent$RadBut4</String>
<String>ctl00$ContentPlaceHolder_MainContent$RadBut5</String>
<String>ctl00$ContentPlaceHolder_MainContent$RadBut5</String>
</ArrayList>
</DictionaryEntry>
</HybridDictionary>
</controlstate>
В основном всего несколько радиолюбителей, которые хотели бы знать об их существовании. (браузеры не отправляют поле <input type="radio">
с постдатами, если оно не проверено). Это уже почти минимально.
Скорее всего, он может быть сжат путем подключения к методам загрузки/сохранения или HTTP-модулям, но это может быть не очень практичным и не нужно.
В случае, если viewstate намного больше в вашем реальном приложении, избегайте вообще получать объекты в viewstate.Это может быть достигнуто путем инициализации элементов управления в методах OnInit()
или Page_Init()
вместо значения по умолчанию Page_Load()
.
Обоснованием этого можно найти на http://weblogs.asp.net/infinitiesloop/archive/2006/08/03/Truly-Understanding-Viewstate.aspx и http://msdn.microsoft.com/en-us/library/ms972976.aspx
краткое резюме:
- ViewState просто резервное хранилище для почти всех свойств элементов управления, в том числе по умолчанию.
- После того, как значения по умолчанию установлены
OnInit()
, вызывается метод TrackViewState()
.
- Любые последующие изменения (например,
Page_Load()
) или обработчик событий будут отслежены и отправлены клиенту. Таким образом, эти элементы управления могут восстановить свое состояние при следующем запросе.
- Вместо того, чтобы полагаться на фреймворк для восстановления объектов, восстанавливайте объекты в
OnInit()
при необходимости. (например, повторное заполнение опций DropDownList
из базы данных).
Одно исключение:
Если элемент управления динамически добавляется к дереву управления, он играет в догонялки. Их метод OnInit()
может работать в более поздний момент, в результате чего эти свойства в конечном итоге попадают в viewstate. Если инициализация элемента управления не может произойти в OnInit()
, установка EnableViewState="false"
может использоваться в качестве обходного пути.
Каждый раз, когда мое окно просмотра неожиданно растет, я использую приложение «ViewState Decoder 2.2», чтобы узнать, что получилось в представлении. Часто для данных не требуется.
И последнее слово:
ViewState не используется для заселив формы !! Эти значения уже отправлены с postdata.
Интересно, что, создав свой экземпляр ObjectStateFormatter, он не получает ссылку на страницу, в которой он используется, и поэтому не будет пытаться зашифровать viewstate. Таким образом, ваш сериализованный viewstate намного проще сжимать, хотя он никогда не будет зашифрован независимо от вашей конфигурации. –