【问题标题】:Page_ClientValidate is validating multiple times.Page_ClientValidate 正在验证多次。
【发布时间】:2010-11-01 10:51:19
【问题描述】:

我遇到的问题是,验证摘要消息(警报)显示两次。我想不通原因。

请帮忙。 这是代码

function validate() //javascript function
{
    if (typeof(Page_ClientValidate) == 'function') 
    {
        var isPageValid = Page_ClientValidate();
        if(isPageValid)
        {
        }
    }
}

<asp:Button ID="btn1" runat="server" OnClientClick="validate()" Text="button"
                    ValidationGroup="ContactGroup" />

<asp:ValidationSummary ID="ValidationSummary1" runat="server" DisplayMode="List" 
                    ShowMessageBox="true" ShowSummary="false" ValidationGroup="ContactGroup" />

【问题讨论】:

  • 验证摘要好像多了两个。

标签: asp.net javascript validation


【解决方案1】:

删除按钮的单击事件,我认为这会强制进行第二次验证。

【讨论】:

    【解决方案2】:

    去掉按钮的onclientclick事件就不需要了

    【讨论】:

      【解决方案3】:

      无需手动调用Page_ClientValidate 函数,除非您想在回发尝试之外进行验证。

      将按钮 CausesValidation 设置为 true。这将运行验证。

      【讨论】:

        【解决方案4】:

        首先,您应该从按钮中丢失ValidationGroup="ContactGroup",因为其中包含验证组将首先调用页面上的验证,然后是包含验证函数的OnClientClick 事件,该事件将再次调用页面验证.

        然后您应该将验证组“ContactGroup”传递给Page_ClientValidate() 函数,以便它知道要验证哪些控件,因为只需调用Page_ClientValidate() 将验证所有控件,而不管它们的验证组如何(并且它可能会显示更多验证消息不止一次,具体取决于您拥有多少个验证组。

        简而言之,做这样的事情:

        function validate() //javascript function
        {
            if (typeof(Page_ClientValidate) == 'function') 
            {
                var isPageValid = Page_ClientValidate('ContactGroup');
                if(isPageValid)
                {
                  //your custom code
                }
            }
        }    
        
        <asp:textbox id="txtMyBox" runat="server"/>
        <asp:requiredFieldValidator Id="rfv1" runat="server" ControlToValidate="txtMyBox"
        ValidationGroup="ContactGroup" ErrorMessage="Bad!"/>
        
        <asp:Button ID="btn1" runat="server" OnClientClick="validate()" Text="button"/>
        
        <asp:ValidationSummary ID="ValidationSummary1" runat="server" DisplayMode="List" 
                            ShowMessageBox="true" ShowSummary="false" ValidationGroup="ContactGroup" />
        

        【讨论】:

          【解决方案5】:

          只需从函数中返回 false 并更改 OnClientClick,如下所示:

          <asp:Button ID="btn1" runat="server" OnClientClick="return validate();" Text="button" 
                                  ValidationGroup="ContactGroup" /> 
          
                  function validate() //javascript function   
                  {   
                      if (typeof(Page_ClientValidate) == 'function')    
                      {   
                          var isPageValid = Page_ClientValidate();   
                          if(isPageValid)   
                          {   
                          }   
                      }   
                  return false;
          
          } 
          

          【讨论】:

            【解决方案6】:

            问题在于函数 Page_ClientValidate 需要一个输入参数,如果您不指定输入,那么每个组名都会触发一次验证摘要。

            在您的情况下,该函数触发两次:一次用于 groupname="ContactGroup",另一次用于 groupname=""

            你应该改变

            var isPageValid = Page_ClientValidate();
            

            var isPageValid = Page_ClientValidate('');
            

            如果您不想指定 ValidationGroup,或者如果您想指定组名,那么您需要像这样调用 Page_ClientValidate:

            var isPageValid = Page_ClientValidate('ContactGroup');
            

            【讨论】:

              【解决方案7】:

              您可以在不显示消息的情况下进行验证,使用以下代码段,然后使用 isPageValid 变量:

               if (Page_ValidationSummaries && Page_ValidationSummaries[0] && Page_ValidationSummaries[0].showmessagebox) {
                          var showMessagesOption = Page_ValidationSummaries[0].showmessagebox;
                          Page_ValidationSummaries[0].showmessagebox = "False";
                          isPageValid = Page_ClientValidate();
                          Page_ValidationSummaries[0].showmessagebox = showMessagesOption;
                      }
              

              【讨论】:

                【解决方案8】:

                我知道这是一篇旧帖子,但这里有一个可能更灵活的解决方案。与其他用户的建议类似,此解决方案接受默认情况下由 asp.net 验证控件传递的验证组。这样您就不需要在 Button 控件上添加OnClientClick="validate()"

                //Make sure the Page_ClientValidate function exists
                if (typeof (Page_ClientValidate) == "function") {
                    //Stash the old implementation in a temp variable
                    Page_ClientValidateOld = Page_ClientValidate;
                
                    //Create a new implementation and store it
                    //in Page_ClientValidate. Callers will now get
                    //this implementation.
                    Page_ClientValidate = function (validationGroup) {
                        var isValid;
                
                        //Call the old implementation first…
                        isValid = Page_ClientValidateOld(validationGroup);
                
                        //and then call our extension
                        if (!isValid) {
                            // Do something
                        }
                
                        return isValid;
                    }
                }
                

                如果您想了解有关此方法的更多信息,我建议您查看此博客文章: http://hyperthink.net/blog/interception-patterns-in-javascript/

                【讨论】:

                  猜你喜欢
                  • 2011-01-04
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2012-04-27
                  • 2023-03-04
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多