как правильно использовать RegisterForEventValidation - PullRequest
7 голосов
/ 10 мая 2011

Я недавно начал использовать ScriptManager. У меня есть элемент управления ASP.NET DropDownList, который я заполняю через JavaScript. Тем не менее, я использую проверку событий. Поэтому я сталкиваюсь с ошибкой ниже, если я не использую здесь вызов RegisterForEventValidation для моего раскрывающегося списка. Как мне узнать, какое значение (я) установить во втором аргументе (где у меня есть «значение»)? Я заполняю свой раскрывающийся список с помощью JavaScript, поэтому я не буду знать, какие значения есть в моем коде. Я предполагаю, что Render вызывается во время частичного рендеринга AJAX, верно? Или нет, так что это называется независимо от того, делаю ли я постбэк на всю страницу или нет. Я думаю, что я хочу услышать не только ответ на мой вопрос, но и если вы можете поделиться со мной своим опытом об ошибке ниже. Я люблю ввод, как и Джонни # 5.

==================

Код:

Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter)

    Page.ClientScript.RegisterForEventValidation(DDLTest.UniqueID, "value")
    MyBase.Render(writer)
End Sub

==================

Ошибка:

Server Error in '/' Application.
Invalid postback or callback argument. Event validation is enabled using <pages enableEventValidation="true"/> 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.

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.ArgumentException: Invalid postback or callback argument. Event validation is enabled using <pages enableEventValidation="true"/> 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.

Ответы [ 2 ]

10 голосов
/ 10 мая 2011

После обширных исследований, прочитанных о Script Manager и методах проб и ошибок, вот что я нашел.

Вы можете отключить проверку событий, но это не всегда лучший вариант, потому что рекомендуется проверять как JavaScript, так и ASP.NET. В этом и заключается цель регистрации этих значений в ваших выпадающих списках. Если у вас есть JavaScript, который вставляет параметры в ваш выбор (выбор визуализируется из элемента управления DropDownList ASP.NET), вы должны по возможности предотвратить внедрение скрипта.

ОТВЕТ НА МОЙ ВОПРОС: Для этого мы вызываем это RegisterForEventValidation для КАЖДОГО возможного значения, которое может когда-либо появиться в этом раскрывающемся списке для любой возможной ситуации в вашем приложении. В моем случае у меня было два раскрывающихся списка , Один раскрывающийся список использовался для создания обратной передачи и повторно заполнял второй раскрывающийся список значениями, основанными на первом раскрывающемся списке. Тем не менее, теперь я использую JavaScript для добавления значений в выпадающий список с помощью jQuery.

Перед повторным заполнением значений я удаляю все значения с помощью jQuery.

jQuery("#<%=DDLTest.ClientID %>").children("option").each(function() {
  jQuery(this).remove();
});

Когда мой первый выпадающий список изменяется, я заполняю второй выпадающий список значениями, соответствующими первому раскрывающемуся значению.

var map = {
                "1112": "Hair 5 Drug Panel",
                "1121": "Hair 5 Drug Panel and Extended Opiates Limit of Detection Test",
                "1120": "Hair 5 Drug Panel Limit of Detection Test"
            };

var thisTemp = this;  // the reason I do this is because "this" is already being used in the callback.

jQuery.each(map, function(key, val) {
  jQuery(thisTemp.Elements.DDLTest).append(jQuery("<option></option>").val(key).text(val));
});

И выберите нужное мне значение.

jQuery(this.Elements.DDLTest).val(quickDataEntryObject.TestPricingOptionId);

Однако, прежде чем все это JavaScript произойдет, я регистрирую возможные значения для раскрывающегося списка. Вы ДОЛЖНЫ сделать это в событии Render.

Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter)

        Dim testPricingOptionTable As DataTable = ApplicationContext.Database.ExecuteDataSet("procEventValidationRegisteredValues", "test_pricing_options").Tables(0)

        For Each testPricingOptionRow As DataRow In testPricingOptionTable.Rows
            Page.ClientScript.RegisterForEventValidation(DDLTest.UniqueID, testPricingOptionRow(0).ToString)
        Next
        MyBase.Render(writer)

    End Sub
2 голосов
/ 10 мая 2011

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

Иногда это невозможно - например, в вашем случае, когда вы динамически заполняете раскрывающийся список из java-скриптов. Решение (я) будет

  1. Отключить проверку события для всей страницы
  2. Используйте некоторые хитрые приемы - например, зарегистрируйте некоторое значение для проверки события, которое желательно всегда присутствовать в раскрывающемся списке (например, "--Select--"), при отправке поместите выбранное раскрывающееся значение в скрытое поле и установите выбранное значение в раскрывающемся списке значение, которое мы использовали для регистрации. Возможно, вам придется добавить это значение в раскрывающийся список, если он отсутствует.
  3. Напишите свой собственный пользовательский элемент управления, который не участвует в проверке событий или выполняет его в соответствии с вашими потребностями.

Обычно я выбираю № 1 или № 3 в зависимости от требований / бюджета и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...