Описание проблемы:
Это одна из распространенных проблем, с которыми сталкиваются многие новички ASP.NET, публикуют и задают вопросы. Как правило, они публикуют сообщение об ошибке, как показано ниже, и ищут решение, не делясь многим информацией о том, что они пытались сделать.
[ArgumentException: недопустимый аргумент обратной передачи или обратного вызова. Проверка события включена с использованием в конфигурации или <% @ Page EnableEventValidation = "true"%> на странице. В целях безопасности эта функция проверяет, что аргументы для событий обратной передачи или обратного вызова исходят от серверного элемента управления, который первоначально их представил. Если данные верны и ожидаемы, используйте метод ClientScriptManager.RegisterForEventValidation, чтобы зарегистрировать данные обратной передачи или обратного вызова для проверки.]
Хотя трассировка стека ошибок сама по себе предлагает быстрое разрешение, отключив проверку событий, это не рекомендуемое решение, поскольку оно открывает дыру в безопасности. Всегда полезно знать, почему это произошло и как решить / справиться с этой корневой проблемой.
Оценка:
Проверка события выполняется для проверки, является ли источник события связанным визуализированным элементом управления (а не каким-либо межсайтовым сценарием или около того). Поскольку элемент управления регистрирует свои события во время рендеринга, события могут быть проверены во время обратной передачи или обратного вызова (через аргументы __doPostBack). Это снижает риск несанкционированных или злонамеренных запросов и обратных вызовов.
См. MSDN: свойство Page.EnableEventValidation
Исходя из вышеизложенного, возможными сценариями, с которыми я сталкивался или слышал, которые поднимают обсуждаемый вопрос, являются:
Случай № 1: Если у нас есть угловые скобки в данных запроса, похоже, что какой-то тег сценария передается на сервер.
Возможное решение:
HTML кодируйте угловые скобки с помощью JavaScript перед отправкой формы, то есть замените «<» на «<» и «>» на «>»
function HTMLEncodeAngularBrackets(someString)
{
var modifiedString = someString.replace("<","<");
modifiedString = modifiedString.replace(">",">");
return modifiedString;
}
Случай № 2: Если мы напишем клиентский скрипт, который изменяет элемент управления в клиенте во время выполнения, у нас может появиться зависшее событие. Примером может быть наличие встроенных элементов управления, где внутренний элемент управления регистрируется для обратной передачи, но скрыт во время выполнения из-за операции, выполняемой с внешним элементом управления. Об этом я читал в блоге MSDN, написанном Карло, когда искал ту же проблему из-за нескольких тегов форм.
Возможное решение:
Зарегистрируйте элемент управления вручную для проверки события в методе Render страницы.
protected override void Render(HtmlTextWriter writer)
{
ClientScript.RegisterForEventValidation(myButton.UniqueID.ToString());
base.Render(writer);
}
Как уже говорилось, один из других распространенных описанных сценариев (который выглядит как относящийся к этой же категории) создает страницу, в которой один тег формы встроен в другой тег формы, который выполняется на сервере. Удаление одного из них исправляет поток и решает проблему.
Случай № 3: Если мы переопределим / создадим элементы управления или команды во время выполнения для каждой обратной передачи, соответствующие / связанные события могут пойти на бросок. Простым примером может быть повторная привязка сетки данных к каждой загрузке страницы (включая постбэки). Поскольку при повторном связывании все элементы управления в сетке будут иметь новый идентификатор, во время события, инициируемого элементом управления сеткой данных, при обратной передаче идентификаторы элемента управления изменяются, и, таким образом, событие может не подключиться к правильному элементу управления, вызывающему проблему.
Возможное решение:
Это можно просто решить, убедившись, что элементы управления не воссоздаются при каждой обратной передаче (перепривязать здесь). Используя свойство Page IsPostback может легко справиться с этим. Если вы хотите создать элемент управления для каждой обратной передачи, необходимо убедиться, что идентификаторы не изменены.
protected void Page_Load(object sender, EventArgs e)
{
if(!Page.IsPostback)
{
// Create controls
// Bind Grid
}
}
Вывод:
Как уже говорилось, простым / прямым решением может быть добавление enableEventValidation = «false» в директиве Page или в файле Web.config, но это не рекомендуется. На основе реализации и причины найдите основную причину и примените решение соответствующим образом.