Неверный аргумент обратной передачи или обратного вызова. При нажатии на кнопку - PullRequest
5 голосов
/ 03 августа 2010

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

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

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

Ошибка источника:

Во время выполнения текущего веб-запроса было сгенерировано необработанное исключение. Информацию о происхождении и местонахождении исключения можно определить с помощью приведенной ниже трассировки стека исключений.

Трассировка стека:

[ArgumentException: недопустимый аргумент обратной передачи или обратного вызова. Проверка события включена с использованием в конфигурации или <% @ Page EnableEventValidation = "true"%> на странице. В целях безопасности эта функция проверяет, что аргументы для событий обратной передачи или обратного вызова исходят от серверного элемента управления, который первоначально их представил. Если данные действительны и ожидаемы, используйте метод ClientScriptManager.RegisterForEventValidation, чтобы зарегистрировать данные обратной передачи или обратного вызова для проверки.] System.Web.UI.ClientScriptManager.ValidateEvent (String uniqueId, String аргумент) +10945696 System.Web.UI.WebControls.DropDownList.LoadPostData (String postDataKey, NameValueCollection postCollection) +72 System.Web.UI.Page.ProcessPostData (NameValueCollection postData, логическое значение fBeforeLoad) +507 System.Web.UI.Page.ProcessRequestMain (логическое значение includeStagesBeforeAsyncPoint, логическое значение includeStagesAfterAsyncPoint) + 2071

Извините за ужасное форматирование. Любые предложения о том, почему эта ошибка возникает и как ее предотвратить?

Спасибо
Бен

Ответы [ 3 ]

3 голосов
/ 03 августа 2010

Я только что нашел ответ на свои вопросы.

Проблема в том, что AJAX добавляет новые значения в выпадающий список, но, поскольку они отсутствуют в viewstate, ASP.NET останавливается с ошибкой. Здесь есть отличный пост в блоге, который объясняет, как решить эту проблему, он отлично сработал для меня.

Обычно вы просто создаете подкласс класса dropdownlist, который избавляется от атрибута SupportsEventValidation -> ASP.NET больше не проверяет значения, и все работает нормально!

Прочитайте весь пост здесь: Создание подкласса DropDownList для удаления атрибута SupportsEventValidation

3 голосов
/ 03 августа 2010

Это известная проблема с AJAX CascadingDropDown extender.

Для правильной работы необходимо отключить проверку события.

Вот тема, обсуждающаяпроблема: http://forums.asp.net/t/1032053.aspx

У меня была такая же проблема, поэтому я отказался от использования расширителя CascadingDropDown и просто использовал обычный выпадающий список на стороне клиента и некоторые jQuery.

У вас есть два варианта:

  1. Отключите AJAX CascadingDropDown, замените его обычными выпадающими списками, вызывая веб-службу по клику клиента с помощью jQuery / javascript.
  2. Отключите проверку события на странице.(не рекомендуется).

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

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

Мой совет, откусите пулю - отбросьте CDDL и заменитес jQuery.

0 голосов
/ 03 октября 2012

Я много искал и в итоге нашел обходной путь: http://avinashsing.sunkur.com/2011/03/24/dropdownlist-in-asp-net-does-not-retain-control-state/

для обычного пользователя на родительской странице:

Protected Sub cbGenericDropDownList_DataBound (отправитель как объект, e как System.EventArgs) Если Not IsNothing (HttpContext.Current.Request (DirectCast (отправитель, DropDownList) .UniqueID)), то DirectCast (отправитель, DropDownList) .SelectedValue = _ HttpContext.Current.Request (DirectCast (отправитель), отправитель.UniqueID) End If End Sub

и затем для каждого элемента управления DropDownList на вашей странице добавьте: OnDataBound = "cbGenericDropDownList_DataBound"

...