как следует правильно использовать RegisterForEventValidation

#asp.net #ajax #events #validation

#asp.net #ajax #Мероприятия #проверка

Вопрос:

Недавно я начал использовать 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.
  

Ответ №1:

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

Вы можете отключить проверку событий, но это не всегда лучший вариант, потому что рекомендуется использовать как проверку JavaScript, так и ASP.NET проверка. В этом и заключается вся цель регистрации этих значений в ваших выпадающих списках. Если у вас есть JavaScript, который вводит параметры в ваш select (выбор отображается из 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, я регистрирую возможные значения для выпадающего списка. Вы ДОЛЖНЫ сделать это в событии рендеринга.

 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
  

Комментарии:

1. @MacGuyver, неправильно, вам не обязательно вызывать RegisterForEventValidation в методе Render(). Вы можете вызвать RegisterForEventValidation во время или до вызова метода Render().

2. @user2220060 Спасибо за разъяснение. Прошло больше года с тех пор, как я смотрел на это. Просто чтобы помочь другим читателям, можете ли вы предоставить список других методов, с помощью которых вы можете это вызвать? Я помню, что ASP.NET имеет последовательность событий, которые запускаются во время обратной передачи всей страницы, но я не помню, что это такое.

3. @Bradley Ты уверен? Я попытался запустить его во время предварительной визуализации и получил сообщение об ошибке: «System. Исключение InvalidOperationException: ‘RegisterForEventValidation может быть вызван только во время Render();'»

Ответ №2:

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

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

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

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

Комментарии:

1. Спасибо за ответ. Вчера я смог решить это самостоятельно. Для тех, кто читает, ПОЖАЛУЙСТА, ПРОЧИТАЙТЕ СЛЕДУЮЩИЙ ПОСТ о том, что я выяснил в этом, просто для разъяснения ответа Vinay из обширного исследования. Виней, я дам тебе очко!!