2009-11-11 3 views
2

У меня есть два раскрывающихся списка:жерех: DropDownList - недопустимый постбэк или аргумент обратного вызова при добавлении параметров с помощью JavaScript/JQuery

<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>");. Это работает так, как ожидалось (я вижу добавленный новый подтип).

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

Invalid postback or callback argument. Event validation is enabled using in configuration or <%@ Page EnableEventValidation="true" %> in a page. For security purposes, this feature verifies that arguments to postback or callback events originate from the server control that originally rendered them. If the data is valid and expected, use the ClientScriptManager.RegisterForEventValidation method in order to register the postback or callback data for validation.

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

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

Другие варианты?

ответ

3

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

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

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

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

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

+0

Rex, не это оставить весь сайт открыт для инъекции сценария? Я бы просто включил его на страницах, где используется элемент управления, и предоставляет дополнительную проверку для любых других входов на странице. –

+1

@ Jim, полагая, что вы полагаетесь на это, чтобы пользователи не отправляли разметку, возможно. Но кто это делает;) –

+0

@Jim Если вы только полагаетесь на проверку страницы, чтобы предотвратить XSS, у вас есть еще одна проблема.Используйте последнюю версию библиотеки AntiXSS для достижения лучшего уровня безопасности и запускайте CAT.NET, чтобы выявить возможные уязвимости. –

2

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

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

items.Add(item2.Value.Trim()); 
Смежные вопросы