Неверный аргумент обратной передачи или обратного вызова - PullRequest
3 голосов
/ 19 сентября 2008

У меня есть приложение ASP.net, которое отлично работает в среде разработки, но в производственной среде выдает следующее исключение при нажатии на ссылку, которая выполняет обратную передачу. Есть идеи?

Неверный аргумент обратной передачи или обратного вызова. Проверка события включена с помощью в конфигурации или <% @ Page EnableEventValidation = "true"%> в стр. В целях безопасности это Функция проверяет, что аргументы события обратного или обратного вызова происходят из серверного элемента управления, который Первоначально оказал их. Если данные действителен и ожидается, используйте ClientScriptManager.RegisterForEventValidation метод для того, чтобы зарегистрировать данные обратного или обратного вызова для проверка.

Редактировать: Это, кажется, происходит только при просмотре с IE6, но не с IE7, какие-нибудь идеи?

Ответы [ 5 ]

2 голосов
/ 24 сентября 2014

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

[ArgumentException: недопустимый аргумент обратной передачи или обратного вызова. Проверка события включена с использованием в конфигурации или <% @ Page EnableEventValidation = "true"%> на странице. В целях безопасности эта функция проверяет, что аргументы для событий обратной передачи или обратного вызова исходят от серверного элемента управления, который первоначально их представил. Если данные верны и ожидаемы, используйте метод ClientScriptManager.RegisterForEventValidation, чтобы зарегистрировать данные обратной передачи или обратного вызова для проверки.]

Хотя трассировка стека ошибок сама по себе предлагает быстрое разрешение, отключив проверку событий, это не рекомендуемое решение, поскольку оно открывает дыру в безопасности. Всегда полезно знать, почему это произошло и как решить / справиться с этой корневой проблемой.

Оценка: Проверка события выполняется для проверки, является ли источник события связанным визуализированным элементом управления (а не каким-либо межсайтовым сценарием или около того). Поскольку элемент управления регистрирует свои события во время рендеринга, события могут быть проверены во время обратной передачи или обратного вызова (через аргументы __doPostBack). Это снижает риск несанкционированных или злонамеренных запросов и обратных вызовов.

См. MSDN: свойство Page.EnableEventValidation

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

Возможное решение: HTML кодируйте угловые скобки с помощью JavaScript перед отправкой формы, то есть замените «<» на «<» и «>» на «>»

function HTMLEncodeAngularBrackets(someString)
{
var modifiedString = someString.replace("<","&lt;");
modifiedString = modifiedString.replace(">","&gt;");
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, но это не рекомендуется. На основе реализации и причины найдите основную причину и примените решение соответствующим образом.

1 голос
/ 19 сентября 2008

Это может произойти, если вы публикуете то, что может показаться вредоносным; например, текстовое поле, содержащее html, но не закодированное до обратной передачи. Если вы разрешаете отправку html или скрипта, вам необходимо закодировать его так, чтобы такие символы, как <, передавались как & lt;. </p>

0 голосов
/ 09 апреля 2017

У меня было нечто подобное, когда у меня был ListBox, который работал нормально, когда я вводил текст вручную, но когда я вводил данные, основанные на запросе SQL, последний элемент в списке выдает это исключение. Я искал все вопросы и ответы, и ничто не соответствовало моей проблеме.

В моем случае проблема заключалась в том, что в данных SQL был непечатаемый символ (\ r). Я предполагаю, что сервер создал хеш-код, основанный на существовании непечатаемого символа, но он был удален из строки, которая фактически отображалась в ListBox, поэтому 2-й хэш не соответствовал 1-му. Очистка строки и удаление непечатаемых символов перед тем, как поместить ее в ListBox, исправили мою проблему.

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

0 голосов
/ 10 ноября 2008

Я получаю это, только когда у меня есть теги <form> на моих страницах. IE6 рассмотрит вложенные теги форм и попытается опубликовать значения в этих формах, а также в основной форме ASP.NET, вызывая ошибку. Другие браузеры не публикуют вложенные формы (поскольку это недействительный HTML) и не получают ошибку.

Вы, безусловно, можете решить эту проблему, выполнив EnableEventValidation = "false", но это может означать проблемы для ваших опубликованных значений и состояния просмотра. Лучше сначала отсеять вложенные теги <form>.

Есть и другие места, где это может возникнуть, например, значения HTML-esque в полях формы, но я думаю, что сообщения об ошибках для них были более конкретными. На обычном постбэке, который выдает это, я бы просто проверил отображаемую страницу на наличие дополнительных тегов <form>.

0 голосов
/ 19 сентября 2008

Кажется, что данные / элементы управления на странице изменяются при обратной передаче. Что произойдет, если вы отключите проверку события в директиве страницы.

<%@ Page ... EnableEventValidation = "false" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...