Page_ClientValidate 正在验证多次。

Posted

技术标签:

【中文标题】Page_ClientValidate 正在验证多次。【英文标题】:Page_ClientValidate is validating multiple times. 【发布时间】: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" />

【问题讨论】:

验证摘要好像多了两个。 【参考方案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/

【讨论】:

以上是关于Page_ClientValidate 正在验证多次。的主要内容,如果未能解决你的问题,请参考以下文章

Page_ClientValidate 未定义 (ASP.NET MVC)

[转]Dropdownlist doesn't postback after Page_ClientValidate()

如何在反应中验证多步表单

多标签分类的交叉验证错误

多模型验证 cakephp 2

为多租户实施 Okta 身份验证