有没有一种很好的方法来处理不显眼的验证看似异步的行为?

时间:2013-03-20 21:11:03

标签: jquery asp.net-mvc asp.net-mvc-4 jquery-validate unobtrusive-validation

我在提交表单时运行了以下缩写的验证码。为我的表单设置了不显眼的验证。

(function () {
    "use strict";

    $("#feedbackForm").submit(function () {
        var t = $(this).serialize();
        var val = $(this).validate();
        console.log(val.errorList.length);
        return false;
    });
})();

当我在Chrome中遇到断点时,我看到以下行为: Unobtrusive validation behavior

您可以从控制台看到,当代码最初执行时,它在验证的错误列表中识别出0个错误,但是当我通过断点暂停执行时,它会识别验证错误列表中的4个错误。此外,在第一次之后,在运行时正确计算了正确的错误数。

  • 这怎么可能?
  • 如何在运行时获取正确数量的错误?

编辑1:

我无法在jsfiddle上重现此问题,因此必须有其他事情发生。

Fiddle


编辑2:

我还必须注意,在提交处理程序中使用setTimeout()每次都会在第二次获得正确的结果,但这似乎只能证实mattytommo在他的回答中提到了什么。

2 个答案:

答案 0 :(得分:3)

您可以使用同步validate检查代替invalidHandler。那样你知道它已经完成了。

它可能在您的小提琴中起作用的原因可能是巧合,因为它更快地验证表单,但实际执行速度较慢。

尝试这样的事情:

$("#feedbackForm").submit(function () {
    var t = $(this).serialize();
    $(this).validate({
        invalidHandler: function(event, validator) {
            var errors = validator.numberOfInvalids();
            if (errors) {
                if (validator.errorList.length > 0) {
                    for (x=0;x<validator.errorList.length;x++) {
                        console.log("\n\u25CF " + validator.errorList[x].message);
                    }
                }
            }
        }
    });

   $(this).validate();

    return false;
});

答案 1 :(得分:3)

最终我不确定为什么手动测量错误的数量不起作用,但最后,我真正想要做的就是验证表单并根据其状态执行某些操作,并实现这一点,Darin迪米特洛夫的建议有效:

How to check that the unobtrusive validations has been validated in jquery function?

我确信我已经尝试了valid()方法,但它没有用,但我想我没有。此外,看起来这个不引人注目的插件在时间上优于其他两个。

工作代码:

(function ($) {
    "use strict";

    $("#feedbackForm").on("submit", function () {
        var t = $(this).serialize(),
            val;

        val = $(this).validate();
        console.log(val.numberOfInvalids());
        console.log(val.errorList.length);
        console.log($(this).valid());       

        return false;
    });
})(jQuery);

Validation

工作小提琴

小提琴在原始案例中起作用,因此无需更新它。