Ошибка ViewState в site.master - PullRequest
       16

Ошибка ViewState в site.master

1 голос
/ 18 октября 2008

Я только что добавил элемент управления календарем asp.net на новой странице в папке примеров в бета-приложении asp.net mvc когда я выполняю определенную страницу, которая мне нужна, и она показывает ошибку, следующую за

Проверка MAC-адреса состояния представления не удалась. Если это приложение размещено на веб-ферме или в кластере, убедитесь, что в конфигурации указан одинаковый ключ validationKey и алгоритм проверки. Автогенерация не может использоваться в кластере. Описание: во время выполнения текущего веб-запроса произошло необработанное исключение. Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и о том, где она возникла в коде.

что указывает на здесь. Это в site.master asp.net mvc

<div id="logindisplay">
    <% Html.RenderPartial("LoginUserControl"); %>
</div> 

обычно, чтобы избежать этой ошибки, мы даем

<pages  validateRequest="false" enableEventValidation="false" viewStateEncryptionMode ="Never" >

но у меня это не работает.

Ответы [ 3 ]

2 голосов
/ 18 октября 2008

Прежде чем читать дальше, пожалуйста, исключите следующие предварительные условия:

  1. Вы не используете веб-ферму.
  2. Появляется при использовании встроенных элементов управления с привязкой к данным, таких как GridView, DetailsView или FormView, которые используют «DataKeyNames».
  3. Появляется, если у вас есть большая страница, которая по какой-либо причине загружается медленно.

Если выполняются следующие предварительные условия, и вы нажимаете элемент управления / ссылку постбэкинга и страница не загружена полностью в клиентском браузере, вы можете получить исключение «Проверка MAC-адреса ViewState не выполнена».

Когда это происходит, если вы просто попытаетесь установить для свойства страницы «EnableViewStateMac» значение false , это не решит проблему, а просто изменит сообщение об ошибке в том же поведении навигации:

Информация о состоянии недопустима для этой страницы и может быть повреждена.

Это исключение появляется, потому что элементы управления, использующие DataKeyNames , требуют, чтобы Viewstate был зашифрован . Когда Viewstate зашифровано (режим по умолчанию, Auto, должен шифровать, если элементы управления требуют этого, в противном случае нет), Page добавляет поле непосредственно перед закрытием тега . Но это скрытое поле, возможно, не было отображено в браузере с долго работающими страницами, и если вы делаете обратную передачу раньше, браузер инициирует обратную передачу без этого поля (в форме сбора записей). Конечным результатом является то, что если это поле пропущено при обратной передаче, страница не знает, что Viewstate зашифровано и вызывает вышеупомянутое исключение. И.Е. страница ожидает полной загрузки перед отправкой.

И, кстати, похожая проблема связана с проверкой событий, поскольку поле __EVENTVALIDATION также отображается в конце формы. Это функция безопасности, которая гарантирует, что действия обратной передачи происходят только из событий, разрешенных и созданных сервером, чтобы помочь предотвратить поддельные обратные передачи. Эта функция реализована с помощью элементов управления, регистрирующих допустимые события при их рендеринге (как, например, во время их реальных методов Render ()). Конечным результатом является то, что в нижней части отрисованного тега вы увидите что-то вроде этого:. Когда происходит обратная передача, ASP.NET использует значения, хранящиеся в этом скрытом поле, чтобы убедиться, что нажатая кнопка вызывает допустимое событие. Если он недействителен, вы получите исключение выше.

Эта проблема возникает, в частности, при обратной передаче до отображения поля EventValidation. Если EventValidation включен (что по умолчанию), но ASP.net не видит скрытое поле при обратной передаче, вы также получаете исключение. Если вы отправите форму до того, как она будет полностью обработана, скорее всего, поле EventValidation еще не было обработано, и поэтому ASP.NET не может проверить ваш щелчок.

Обход

Установите enableEventValidation в false и viewStateEncryptionMode в Neve r следующим образом:

<pages enableeventvalidation="false" viewstateencryptionmode="Never">

У этого есть нежелательный побочный эффект отключения проверки и шифрования. На некоторых сайтах это может быть нормально, но это не лучшая практика, особенно на публичных сайтах.

Дополнительную информацию и другие способы обхода см. В этой записи блога .

0 голосов
/ 22 мая 2009
I have been struggling with this issue too since lasts few days and finally found the problem.

This error will show up in there are multiple <form> tags are being rendered on a page (be it html <form></form> or Html.BeginForm()).
Check the user controls being rendered, the content page section and also the Master page.
Make sure there is only one form rendered on a page.

This should fix your problem, if the issue persists, check for the for submit buttons rendered on the page (<input type="submit" …/>)

Cheers!
Mayank Srivastava
0 голосов
/ 26 марта 2009

Это случилось со мной всего несколько минут назад. К счастью, я нашел эту запись в блоге на эту тему. В результате (по крайней мере, для меня) у меня было две формы: одна на странице и одна на контроле.

Мне не нужно было одного на странице, поэтому я удалил его, и ошибка исчезла.

...