Скрытое поле Viewstate настолько велико, что все рушится

По какой-то причине состояние просмотра моего приложения стало гигантским (около 14 миллионов символов). Это добавляет около 1 минуты времени загрузки. Если страница, наконец, загружается (что бывает нечасто), сервер падает каждый раз, когда кто-то отправляет форму, потому что "Post size exceeded allowed limits."

Оно появилось внезапно. Я не добавлял никаких полей, просто какой-то javascript на странице.

Люди посоветовали мне проверить выделение состояния просмотра. Google сказал мне сделать это:

<pages maxPageStateFieldLength="1024">

... так что теперь вместо огромного скрытого поля у меня теперь есть что-то вроде 100 очень больших скрытых полей. Это не совсем то, что я искал.

Зачем .NET делать что-то подобное? Как я могу это исправить?


person marcgg    schedule 24.08.2009    source источник
comment
Есть ли шанс, что вы можете отключить состояние просмотра для некоторых элементов управления?   -  person Chris Van Opstal    schedule 24.08.2009
comment
Трудно сказать, не глядя на страницу, но попробуйте декодер состояния просмотра, чтобы увидеть, что встраивается в состояние просмотра. Вы также должны отключить состояние просмотра сеток/таблиц, если они вам не нужны, и, возможно, внедрить сжатое состояние просмотра в дополнение к включению gzip в IIS.   -  person Mikael Svenson    schedule 24.08.2009
comment
Элементы управления являются полями ввода, и для них нет способа отключить состояние просмотра, и даже если бы это было так, это потребовало бы от меня повторного написания большого количества кода. Также есть около 10 полей, это не должно быть так уж плохо... верно?   -  person marcgg    schedule 24.08.2009
comment
@mikael: как мне отключить состояние просмотра сеток/таблиц? У меня есть только поля ввода, возможно ли, что .net решил, что некоторые другие поля должны быть в состоянии просмотра?   -  person marcgg    schedule 24.08.2009
comment
Для чего вы используете состояние просмотра на входах? Если вам просто нужно, чтобы они запоминали свои значения при обратных передачах, это будет работать без состояния просмотра.   -  person Chris Van Opstal    schedule 24.08.2009
comment
Очевидно, что происходит что-то еще, если у вас всего 10 полей. Используете ли вы настраиваемые элементы управления, использующие ресурсы? Как вы добавили javascript на страницу?   -  person womp    schedule 24.08.2009
comment
@chris: Чтобы запомнить значения и использовать их в моем бэкэнде ... Я имею в виду, что могу реорганизовать это, но возможно ли вообще отключить для них состояние просмотра? В прошлый раз, когда я проверял, он не работал, как я ожидал   -  person marcgg    schedule 24.08.2009
comment
@womp: я генерирую javascript на стороне сервера. У меня есть пара петель в асп и это почти все   -  person marcgg    schedule 24.08.2009
comment
Текстовые поля @marcgg сохранят свое значение при обратных передачах даже без включенного состояния просмотра.   -  person Chris Van Opstal    schedule 24.08.2009
comment
@chris: было бы неплохо найти ответ, который не подразумевает, что мне нужно переписать слишком много кода, и отключение состояния просмотра для всего было бы немного жестоким. Если нет другого пути, я сделаю это... но не с радостью :)   -  person marcgg    schedule 24.08.2009


Ответы (2)


Я бы предложил использовать утилиту для декодирования вашего состояния просмотра, чтобы вы могли получить представление о том, что на самом деле находится внутри него (поскольку у вас, очевидно, есть много информации, которая вам, похоже, не нужна).

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

person Beska    schedule 24.08.2009
comment
Это раздражает, программа вылетает, видимо строка слишком большая. Но теперь я знаю, что длина моего состояния просмотра составляет 13 428 604 символа :) - person marcgg; 24.08.2009
comment
Наконец-то он запустился без сбоев с моей пятой попытки :) Похоже, он помещает всю мою страницу в состояние просмотра... это довольно странно. Я попытаюсь понять, в чем здесь логика, и вернусь на SO - person marcgg; 24.08.2009
comment
Хорошо, я понял это. Я принимаю ваш ответ, потому что именно вы ведете меня в правильном направлении ... хотя ответ Криса также мне очень помог. Проблема заключалась в том, что эта страница была страницей поиска... и по какой-то причине она включала все результаты в состоянии просмотра, хотя поиск не выполнялся. Я видел это, используя декодер состояния просмотра. Затем исправить это было просто, я добавил EnableViewState=false в .ascx, в котором хранились результаты поиска, и это исправило. ура! - person marcgg; 24.08.2009
comment
@marcgg Именно это я и имел в виду, отключив состояние просмотра :) Рад, что вы это поняли. - person Mikael Svenson; 28.08.2009

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

EnableViewState="false"

Если вы установите это для всех ваших сеток и любых элементов управления, которые вам не нужны для просмотра, это значительно уменьшит размер.

person Chris Van Opstal    schedule 24.08.2009
comment
Я сделал это, и это ничего не изменило. Я включаю файлы .ascx следующим образом: ‹uc1:attributeAutocomplete EnableViewState=false runat=server id=_temposAutocomplete ›‹/uc1:attributeAutocomplete› и там довольно много JS. Может ли это быть связано? Я отключил состояние просмотра для них, и это не исправило - person marcgg; 24.08.2009
comment
Я понял это (см. принятый ответ)! Я принял beska, потому что это ответ, который помог мне разобраться в проблеме, но ваш также был полезен ... так что +1 и большое спасибо :)! - person marcgg; 24.08.2009