同一控件上的多个ASP.NET验证程序 - Page_Validator.isValid始终为true

时间:2014-02-26 13:20:51

标签: javascript asp.net validation

我正在使用此JavaScript代码,以便在验证失败后突出显示文本框和其他控件(指定了ASP.NET验证程序)。

<script src="_scripts/jquery-1.6.4.min.js" type="text/javascript"></script>
<script type="text/javascript">
    $(document).ready(function() {
        HighlightControlToValidate();
        $('#<%=btnSave.ClientID %>').click(function() {
            if (typeof (Page_Validators) != "undefined") {
                for (var i = 0; i < Page_Validators.length; i++) {
                    if (!Page_Validators[i].isvalid) {
                        $('#' + Page_Validators[i].controltovalidate).css("background", "#f3d74f");
                    }
                    else {
                        $('#' + Page_Validators[i].controltovalidate).css("background", "white");
                    }
                }
            }
        });
    });

    function HighlightControlToValidate() {
        if (typeof (Page_Validators) != "undefined") {
            for (var i = 0; i < Page_Validators.length; i++) {              
                $('#' + Page_Validators[i].controltovalidate).blur(function() {
                var validatorctrl = getValidatorUsingControl($(this).attr("ID"));                               
                    if (validatorctrl!= null && !validatorctrl.isvalid) {
                        $(this).css("background", "#f3d74f");
                    }
                    else {
                        $(this).css("background", "white");
                    }
                });
            }
        }
    }   
    function getValidatorUsingControl(controltovalidate) {      
        var length = Page_Validators.length;
        for (var j = 0; j < length; j++) {
            if (Page_Validators[j].controltovalidate == controltovalidate) {
                return Page_Validators[j];
            }
        }
        return null;
    }   
</script>

只要在同一控件上指定的ASP.NET验证程序不超过一个,此脚本就可以正常工作。不幸的是,如果在同一个控件上指定了多个ASP.NET验证器并且验证失败,则不会突出显示相关控件。

使用Chrome开发人员工具进行调试后,我发现只要在同一个控件上指定了多个ASP.NET验证器,所讨论的ASP.NET验证器的isValid属性始终设置为“true”,即使验证失败。如果同一控件上的ASP.NET验证器缩减为一个验证器,则验证失败时isValid属性将设置为“false”,应该如此。

为什么会这样?我怎么解决这个问题?感谢。

1 个答案:

答案 0 :(得分:1)

如果我已正确读取密码,您的代码将循环遍历每个验证器,然后获取相关控件的第一个验证器。

因此,一个控件可能有3个验证器,然后对于这三个验证器中的每一个,它将获得相同的控件,然后是该控件的第一个验证器。

而不是使用:

getValidatorUsingControl($(this).attr("ID"))

只需使用:

$('#' + Page_Validators[i])[0]

实际上,这不起作用,因为我会超出范围或在字段模糊时更改值,但是按照这些方式做一些事情。