В настоящее время я борюсь с .NET Viewstate, и он начинает меня изматывать. Обнаружив, что некоторые страницы в одном из наших приложений состоят примерно из 80% просмотра, я попытался уменьшить это, где смогу.
Я смотрел (и доволен) отключением режима просмотра для элементов управления, которые ему не нужны (надписи, кнопки и т. Д.), И добился здесь небольшого выигрыша.
Сейчас я смотрю на сжатие состояния представления, и хотя я могу продемонстрировать уменьшение размера на 40-50%, оно не очень хорошо работает с моим приложением.
Сценарий:
Страница содержит несколько выпадающих списков, кнопку и Grdiview (отсюда и необходимость иметь дело с ViewState!). Когда страница загружается, DDL заполняются и выбираются значения по умолчанию. Нажатие кнопки ОК приводит к тому, что Gridview заполняется, как и ожидалось.
Теперь проблема: с включенным Viewstate Compression, если пользователь изменяет выбранные элементы в DDL перед нажатием кнопки OK, он получит ошибку «Required Field Validator», указывающую, что выбор не был сделан в одном из DDL - Но это не так! Отключение кода сжатия устраняет проблему, и страница работает должным образом (то есть, как это было в течение нескольких месяцев!).
Возможно, проблема заключается в том, что состояние представления теперь хранится в ключе, отличном от __VIEWSTATE [код, который я видел, использует разные имена ключей - например, VSTATE).
Источники моей страницы выглядят так:
Источник страницы со сжатием (обратите внимание на пустую клавишу __VIEWSTATE):
<div>
<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />
<input type="hidden" name="__LASTFOCUS" id="__LASTFOCUS" value="" />
<input type="hidden" name="__VSTATE" id="__VSTATE" value="H4sIAAAAAEAO29B2AcSZYlJ
.
.
MKd2afqdaImFR5UiFXVyQPwLPA//8xt+pMsSQ8vlOklcoNgmZfJd8hHvk6/S/7UbxxAJTjzZfp6Qcm039
h3d3dvvPO7/Oa/7i57uemj1H2a/gw5lJQ+ySjFRtPZUL7A/3o2ImFR5UiFXVyLPA+38At70F1EkwAAA=" />
<input type="hidden" name="__VIEWSTATE" id="
__VIEWSTATE" value="" />
</div>
Источник страницы без сжатия:
<div>
<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />
<input type="hidden" name="__LASTFOCUS" id="__LASTFOCUS" value="" />
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKMTYxOTM1NDg4N
A9kFgJmD2QWAgIDD2QWAgIFD2QWAmYPZBYKAgEPZBYIAgcPZBYCAgMPDxYCHgRUZXh0BRdEYXduQyBbY2hhbm
dlIHBhc3N3b3JkXWRkAgkPFgIeB1Zpc2libGVoFgQCAQ8PFgIfAAUFQWRtaW5kZAIDDw8WAh8ABQUxNDoyNGR
.
.
.
.
.
.
kAgsPDxYEHwAFWVNlbGVjdGVkIFNlcnZpY2UgVXNlcjogPGEgY2xhc3M9J3N1U2VsZWN0b3InIGhyZWY9J2xp
c3RzZXJ2aWNldXNlcnMuYXNweCc+PGI+bm9uZTwvYj48L2E+HwFoZGQCDw8QZGQWAGQCBQ8UKwADZDwrABQEA
BYSHg9QYXJlbnRJdGVtQ2xhc3MFC2lnbW5fUGFyZW50HhdUb3BMZXZlbFBhcmVudEl0ZW1DbGFzcwUTaWdtbl
Ub3BFBhcmVudB4KSlNGaWxlTmFtZWUeFlRvcExldmVsSG92ZXJJdGVtQ2xhc3MFNGlnbW5fVG9wTGV"
/>
</div>
Как .NET узнает, где хранится VIEWSTATE, и знает ли я, что я его переместил?
Нужно ли вносить какие-либо другие изменения в мой код, кроме реализации SavePageStateToPersistenceMedium и LoadPageStateFromPersistenceMedium?