asp: DropDownList - неверный аргумент обратной передачи или обратного вызова при добавлении параметров через JavaScript / jQuery - PullRequest
2 голосов
/ 11 ноября 2009

У меня есть два выпадающих списка:

<asp:DropDownList ID="Field_Type" runat="server" />
<asp:DropDownList ID="Field_SubType" runat="server" />

Field_Type привязан к базе данных со списком типов, заполняемых из базы данных. Field_SubType устанавливается через jQuery / AJAX при изменении Field_Type. Затем я добавляю опцию, используя $("#<%# Field_SubType.ClientID %>").append("<option value=\"1\">Test</option>");. Это работает как ожидалось (я вижу добавленный новый подтип).

Однако при публикации после выбора опции, которая была добавлена, я получаю сообщение об ошибке:

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

Что могло быть причиной этого, и как я мог обойти это? У меня есть несколько идей:

  1. Используйте простой <select> и используйте Request.Form - может возникнуть проблема, если он используется в пользовательском элементе управления, многократно используемом на странице
  2. Заполните Field_SubType всеми подтипами, отфильтровав те, которые не являются подтипами Field_Type - это загрузит больше данных, чем требуется, что увеличит время загрузки страницы

Есть ли другие варианты?

Ответы [ 2 ]

3 голосов
/ 11 ноября 2009

Причиной этого является то, что по умолчанию ASP.NET проверяет, что отправленные значения в каждом поле формы являются теми, которые были отправлены на страницу изначально. Вот пример:

У нас есть DropDownList с 3 вариантами - A, B и C. ASP.NET знает о них, потому что мы добавили их из кода ASP.NET. В JavaScript мы добавляем четвертый вариант, D. ASP.NET не знает об этом, потому что это произошло на стороне клиента. Когда мы отправляем страницу, если выбран вариант D, ASP.NET говорит: «D - это не один из вариантов, которые я вам дал. Возможно, вы злонамеренно пытаетесь манипулировать значениями сообщения в запросе». Он защищает систему и разработчика, прерывая запрос прямо там.

Вы можете просто отключить проверку страницы - на рассматриваемой странице, как предлагается в сообщении об ошибке, или для всех страниц на уровне web.config:

<system.web>
   <pages enableEventValidation="false"/>
</system.web>

Проверка события не всегда необходима, если вы пишете свой код таким образом, что вы никогда не выполняете явное действие, напрямую основанное на значениях, представленных вам в форме (что вам никогда не следует делать в любом случае). Неожиданные или не входящие в диапазон значения от пользователя должны игнорироваться или заставлять вас ничего не делать. Пока вы пишете свой код таким образом, вы можете безопасно отключить проверку событий.

2 голосов
/ 18 июля 2012

Это также может произойти, если вы загружаете свой выпадающий список с текстом, который не был обрезан. Я загрузил выпадающий список из XML, и он поместил символы новой строки и пробелы в элементах. Однако, когда появился выпадающий список, все выглядело хорошо. После изменения выпадающего меню я получил ошибку.

Добавление обрезки решило проблему:

items.Add(item2.Value.Trim());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...