Page_ClientValidate多次验证。

时间:2009-06-09 11:20:41

标签: asp.net javascript validation

问题是,验证摘要消息(警报)显示两次。我无法弄清楚原因。

请帮忙。 这是代码

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

8 个答案:

答案 0 :(得分:23)

问题是函数Page_ClientValidate接受一个输入参数,如果你没有指定输入,那么每个组名都会触发一次validationsummary。

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

你应该改变

var isPageValid = Page_ClientValidate();

var isPageValid = Page_ClientValidate('');

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

var isPageValid = Page_ClientValidate('ContactGroup');

答案 1 :(得分:5)

嘿那里。首先,您应该从按钮中松开ValidationGroup =“ContactGroup”,因为其中的验证组将首先调用页面上的验证然后包含将调用页面验证的validate函数的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" />

答案 2 :(得分:3)

只需从函数返回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;

} 

答案 3 :(得分:2)

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

将按钮CausesValidation设置为true。那将进行验证。

答案 4 :(得分:2)

您可以在没有显示消息的情况下进行验证,使用以下代码段,然后使用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;
        }

答案 5 :(得分:1)

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

答案 6 :(得分:0)

删除按钮的onclientclick事件,不需要那个

答案 7 :(得分:0)

我知道这是一个老帖子,但这里的解决方案可能更灵活。与其他用户建议类似,此解决方案接受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/