Прежде чем читать дальше, пожалуйста, исключите следующие предварительные условия:
- Вы не используете веб-ферму.
- Появляется при использовании встроенных элементов управления с привязкой к данным, таких как GridView, DetailsView или FormView, которые используют «DataKeyNames».
- Появляется, если у вас есть большая страница, которая по какой-либо причине загружается медленно.
Если выполняются следующие предварительные условия, и вы нажимаете элемент управления / ссылку постбэкинга и страница не загружена полностью в клиентском браузере, вы можете получить исключение «Проверка 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">
У этого есть нежелательный побочный эффект отключения проверки и шифрования. На некоторых сайтах это может быть нормально, но это не лучшая практика, особенно на публичных сайтах.
Дополнительную информацию и другие способы обхода см. В этой записи блога .