OnSelectedIndexChange срабатывает только при втором щелчке при использовании пользовательского сценария проверки страницы - PullRequest
1 голос
/ 25 марта 2010

Хорошо ... это трудно объяснить, так что вот так.

У меня есть панель обновления, которая содержит несколько элементов управления. Панель обновления запускается событием OnSelectedIndexChanged раскрывающегося списка с именем: ddlUSCitizenshipStatus. Он работает, как и ожидалось, когда я выбрал новый элемент.

Однако, если я оставлю ddlUSCitizenshipStatus со значением по умолчанию, а затем нажму кнопку «отправить» на странице, требуемые полевые валидаторы скажут, что в ddlUSCitizenshipStatus произошла ошибка (что и следует, поскольку я никогда не выбирал значение). Затем я выбираю значение, сообщение об ошибке исчезает на ddlUSCitizenshipStatus, однако панель обновления не обновляется. Я отладил это локально, и событие OnSelectedIndexChanged для ddlUSCitizenshipStatus не запускается.

Если я выбираю элемент в списке ddlUSCitizenshipStatus второй раз , событие сервера OnSelectedIndexChanged срабатывает, и панель обновления обновляется и работает, как и ожидалось.

Проблема в том, что мне нужно дважды выбрать элемент в ddlUSCitizenshipStatus, после неудачной проверки, до того, как панель обновлений будет сидеть в обновлениях.

Кнопка отправки на странице выглядит так:

<asp:LinkButton ID="btnSubmitPage1" runat="server" CssClass="continueButton" OnClick="btnSubmitPage1_Click" CausesValidation="true" OnClientClick="javascript: return ValidatePage();" />

Если я удалю свой собственный скрипт OnClientClick, кнопка «Отправить» будет выглядеть следующим образом:

<asp:LinkButton ID="btnSubmitPage1" runat="server" CssClass="continueButton" OnClick="btnSubmitPage1_Click" CausesValidation="true" ValidationGroup="valGrpAdditionalInformation" />

Выпадающий список, панель обновлений и regidiredfieldvalidator работают должным образом. Однако мне нужно запустить этот пользовательский сценарий «ValidatePage ()» при нажатии кнопки.

Ниже показано, как выглядит мой скрипт ValidatePage. Я исправляю это больше часов, чем могу сосчитать .... Надеюсь, кто-нибудь сможет мне помочь. Пожалуйста, дайте мне знать, если вы можете выяснить, почему ddlUSCitizenshipStatus не обновляет панель обновления до второго щелчка после неудачной проверки.

function ValidatePage()
{
 var blnDoPostBack = true;

 if (typeof(Page_ClientValidate) == 'function' )
 {
  //Client side validation can occur, so lets do it.

  //Validate each validation group. 
  for( var i = 0; i < Page_ValidationSummaries.length; i++ )
   Page_ClientValidate( Page_ValidationSummaries[i].validationGroup.toString() );

  //Validate every validation control on the page.
  for (var i = 0; i < Page_Validators.length; i++)
   ValidatorValidate(Page_Validators[i]);

  //Figure out which validation groups have errors, store a list of these validation groups in an array.
  var aryValGrpsWithErrors = [];
  for( var i = 0; i < Page_Validators.length; i++ )
  {
   if( !Page_Validators[i].isvalid )
   {
    //This particular validator has thrown an error.
    //Remeber to not do a postback, as we were able to catch this validation error client side.
    blnDoPostBack = false;

    //If we haven't already registered the validation group this erroring validation control is a part of, do so now.
    if( aryValGrpsWithErrors.indexOf( Page_Validators[i].validationGroup.toString() ) == -1 )
     aryValGrpsWithErrors[aryValGrpsWithErrors.length++] = Page_Validators[i].validationGroup.toString();
   }
  }

  //Now display every validation summary that has !isvalid validation controls in it.
  for( var i = 0; i < Page_ValidationSummaries.length; i++ )
  {
   if( aryValGrpsWithErrors.indexOf( Page_ValidationSummaries[i].validationGroup.toString() ) != -1 )
   {
    Page_ValidationSummaries[i].style.display = "";
    document.getElementById( Page_ValidationSummaries[i].id.toString() + "Wrapper" ).style.display = "";
   }
   else
   {
    //The current validation summary does not have any error messages in it, so make sure it's hidden.
    Page_ValidationSummaries[i].style.display = "none";
    document.getElementById( Page_ValidationSummaries[i].id.toString() + "Wrapper" ).style.display = "none";
   }
  }
 }

 return blnDoPostBack;
}

Ответы [ 2 ]

1 голос
/ 27 октября 2010

Я нашел решение этой проблемы и разместил его здесь: http://forums.asp.net/t/1554406.aspx В этом сообщении был ответ, который я искал: http://lionsden.co.il/codeden/?p=137&cpage=1#comment-143

Что такое Page_BlockSubmit

Когда пользователь нажимает кнопку, вызывающую полный пост, после запуска Page_ClientValidate ASP.NET запускает еще одну встроенную функцию ValidatorCommonOnSubmit.В пределах Page_ClientValidate Page_BlockSubmit устанавливается на основе проверки.Обратная передача затем блокируется в ValidatorCommonOnSubmit, если Page_BlockSubmit имеет значение true.Независимо от того, что в конце функции Page_BlockSubmit всегда сбрасывается обратно в false.

Если страница выполняет частичную обратную передачу без какой-либо проверки, а Page_BlockSubmit не была сброшена в false, частичная обратная передача будет заблокирована.,По сути, вышеуказанная функция RunValidation действует аналогично ValidatorCommonOnSubmit.Он запускает проверку и затем возвращает false, чтобы при необходимости заблокировать обратную передачу.Поскольку встроенный постбэк никогда не запускается, нам нужно вручную сбросить Page_BlockSubmit перед возвратом результата проверки.

После вызова Page_ClientValidate переменная Page_BlockSubmit получает значение true, что блокирует автопост обратно.Page_BlockSubmit сбрасывался до false при втором нажатии, по причинам, которые я до сих пор не до конца понимаю.Я больше разбираюсь в этом, но у меня есть решение, и я нахожусь под прицелом, поэтому я катаюсь с ним.

Итак, ранее у меня был следующий код:

for( var i = 0; i < Page_ValidationSummaries.length; i++ )
   Page_ClientValidate( Page_ValidationSummaries[i].validationGroup.toString() );

Добавляя Page_BlockSubmit = false ниже этого, я получаю это:

for( var i = 0; i < Page_ValidationSummaries.length; i++ )
   Page_ClientValidate( Page_ValidationSummaries[i].validationGroup.toString() );

Page_BlockSubmit = false;

, что позволяет элементам управления AutoPostBack = true выполнять внутри панелей обновления.Однако сама форма по-прежнему никогда не отправляется, потому что мой код проверки на стороне клиента возвращает false, если для одного Page Validator указано недопустимое значение.

0 голосов
/ 21 октября 2010

У меня была такая же проблема, хотя все, что у меня есть, это Textbox, использующий RangeValidator, вместе с кнопкой отправки. Когда пользователь ввел число вне диапазона и нажал «Отправить», появилось сообщение с недействительным номером. Если они изменили номер на действительный и снова нажали «Отправить», сообщение исчезло, но событие onclick не сработало. Если они нажали кнопку «Отправить» во второй раз, он сработал.

Мне пришлось удалить атрибут Display = "Dynamic" из RangeValidator, чтобы исправить это.

...