OnSelectedIndexChange仅在使用自定义页面验证脚本时在第二次单击时触发

时间:2010-03-24 21:37:31

标签: .net validation drop-down-menu updatepanel client-side

好的..这很难解释,所以在这里。

我有一个包含许多控件的更新面板。更新面板由名为ddlUSCitizenshipStatus的下拉列表的OnSelectedIndexChanged事件触发。当我选择一个新项目时,它按预期工作。

但是,如果我将ddlUSCitizenshipStatus保留为默认值,然后单击页面上的“提交”按钮,则requiredfieldvalidators表示ddlUSCitizenshipStatus上存在错误(它应该,因为我从未选择过值)。然后我选择一个值,错误消息在ddlUSCitizenshipStatus上消失,但更新面板不刷新。我在本地调试了这个,并且ddlUSCitizenshipStatus的OnSelectedIndexChanged事件不会触发。

如果我再次在ddlUSCitizenshipStatus列表中选择一个项目,则会触发OnSelectedIndexChanged服务器事件,并且更新面板将刷新并按预期工作。

问题是,我必须在验证失败后两次在ddlUSCitizenshipStatus中选择一个项目,然后再更新它所在的updatepanel。

页面上的提交按钮如下所示:

<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" />

下拉列表,更新面板和reguiredfieldvalidator都按预期工作。但是,我需要在单击按钮时运行该自定义“ValidatePage()”脚本。

以下是我的ValidatePage脚本的样子。我一直在排除故障的时间超过我的数量......我希望有人能够帮助我。如果你能弄清楚为什么ddlUSCitizenshipStatus在验证失败后第二次点击之前不会更新updatepanel,请告诉我。

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 个答案:

答案 0 :(得分:1)

我找到了这个问题的解决方案,并在此处发布: 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基于验证设置。如果Page_BlockSubmit为true,则在ValidatorCommonOnSubmit中阻止回发。无论如何,在函数结束时,Page_BlockSubmit总是重置为false。

     

如果页面执行部分回发而未运行任何验证且Page_BlockSubmit尚未重置为false,则将阻止部分回发。实质上,上述函数RunValidation的作用类似于ValidatorCommonOnSubmit。它运行验证,然后返回false以阻止回发(如果需要)。由于内置回发永远不会运行,我们需要在返回验证结果之前手动重置Page_BlockSubmit。

调用Page_ClientValidate后,变量Page_BlockSubmit将设置为true,从而阻止autopost返回。由于我仍然不完全理解的原因,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控件在updatepanels内执行。但是,表单本身仍然没有提交,因为只要单个页面验证器具有无效值,我的客户端验证代码就会返回false。

答案 1 :(得分:0)

我遇到了同样的问题,尽管我只有一个使用RangeValidator的Textbox,还有一个提交按钮。当用户输入范围之外的数字并单击“提交”时,会出现无效编号消息。如果他们将数字更改为有效数字并再次单击“提交”,则消息消失,但onclick事件未触发。如果他们第二次点击“提交”则会触发。

我不得不从RangeValidator中删除Display =“Dynamic”属性来修复它。