2009-03-30 6 views
0

Этот вопрос, кажется, был задан раньше, но я чувствую, что моя ситуация несколько отличается.Недопустимый аргумент обратной связи или обратного вызова

У меня есть страница, содержащая сетку. При нажатии кнопки для редактирования одной из записей в gridview кнопка сначала выполняет некоторый клиентский скрипт, который выдает модальное окно для редактирования (устанавливается с использованием .onClientClick). Из этого всплывающего окна пользователь нажимает «Обновить», который обновляет базу данных и закрывает окно. Как только окно будет закрыто, предполагается, что на серверном коде кнопки будет срабатывать, что вызовет функцию для обновления gridview. Вместо этого появляется сообщение об ошибке:

Недопустимый аргумент обратной связи или обратного вызова. Проверка событий разрешена с использованием конфигурации или на странице. Для целей безопасности эта функция проверяет, что аргументы для обратной передачи или события обратного вызова происходят из серверного элемента управления , который первоначально отправил их . Если данные действительны и ожидаются, используйте метод ClientScriptManager.RegisterForEventValidation для регистрации данных обратной передачи или обратного вызова для проверки .

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

Любые предложения относительно того, как я мог избежать этого?

UPDATE: Я удалил строку кода, которая добавила клиентский скрипт, и я все еще получаю сообщение об ошибке. Поэтому я довольно уверен, что это вызвано просто обратной передачей. При ближайшем рассмотрении я понимаю, что на самом деле некоторые элементы ListItems программно связаны с DropDownLists. Итак ... Мне, вероятно, нужно сделать задачу ClientScriptManager.RegisterForEventValidation ... Может ли кто-нибудь дать мне пример того, как будет выглядеть синтаксис для этого? Кажется, что он настроен иначе, чем объект ScriptManager ....

ответ

1

Если ваша кнопка создана в кодировке (например, ваше событие RowDataBound создает новый экземпляр Button и добавляет его в ячейку), то вы необходимо будет воссоздать эти элементы управления (с теми же ID с) до этапа управления событиями жизненного цикла страницы. Воспроизведение кнопок в событии Load должно работать нормально.

Если ваши элементы управления созданы, и вы привязали обработчики к их событиям, то наиболее вероятной причиной этой ошибки является javascript, который изменяет вашу DOM/форму.

+0

hmm, no кнопка (ImageButton) определена в .aspx «onClientClick» добавлен в RowDataBound ... может ли это иметь какое-то отношение к этому? –

+0

Является ли ваш обработчик Click прикрепленным в разметке или в коде? Событие Click, а не ClientClick. –

+0

в разметке:

0

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

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

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

+0

Спасибо за ответ ... Как бы вы предложили отключить проверку событий? Я поместил EnableViewStateMac = "false" в директиву страницы, но я все равно получаю ту же ошибку. –

0

Попробуйте эту строку в директиве страницы, когда у меня была подобная ошибка, и с этим ошибка была решена

EnableEventValidation="false" 

Привет !!!

+1

Это работает ... Но мой босс не хотел идти по этому маршруту. –

0

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

Опция, зависящая от сценария, заключается в том, чтобы не использовать обратную передачу в этом случае, но делать регулярную ссылку, чтобы обновить страницу. В качестве альтернативы вы можете сделать EnableEventValidation = false, как было предложено, но вам нужно дополнительно убедиться, что вы не полагаетесь на любые значения, отправленные клиенту, то есть выпадающие списки могут иметь значения, не входящие в список, который вы связали.

+0

Не могли бы вы экстраполировать, как обновить страницу без обратной передачи? Какой тип контроля может это сделать? Или вы имеете в виду, что я должен добавить еще одну кнопку (т.е. «обновить»), которую пользователь нажмет, чтобы обновить сетку по запросу? –

+0

@Matthew вы можете использовать asp: HyperLink и присвоить ему текущую страницу Url. Как я уже сказал, это зависит от сценария, так как это не поможет, если вы используете элементы управления вне gridview для фильтрации списка. Это будет так же, как любая другая ссылка, которая приведет вас к этой странице. – eglasius

-1

Я получил эту ошибку, когда создал ASP.Net WebForm, и нажал кнопку «Отправить».

HTML был создан с тегом, вложенным в тег, и браузер увидел вложенный тег как закрывающий форму ASP.Net. В результате скрытое поле __EVENTVALIDATION было вне формы и не отправлено на сервер.

Очистка вложенного тега от разметки разрешила проблему.

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

Смежные вопросы