停止自定义验证器在每次击键时触发

时间:2011-02-11 14:57:50

标签: jquery asp.net-mvc unobtrusive-javascript

我使用MVC DataAnnotations和jQuery unobtrusive javascript库编写了一个自定义验证器。它工作得很好。我现在唯一的问题是,在初始验证之后,如果用户编辑了该字段,则它会在每次击键时触发验证器。由于验证器访问Web服务以验证输入,我宁愿它只是在用户离开字段或提交表单时验证输入。有没有办法改变这种行为?这是我的代码:

<script type="text/javascript">
    $.validator.addMethod("validate_zipcode", function (value, element) {
        if (value == null || value.length == 0) {
            return true;
        }

        var isValid = false;
        $.ajax({
            async: false,
            dataType: "json",
            url: "/api/iszipvalid/" + value,
            success: function (response) {
                isValid = response;
            }
        });

        return isValid;
    });

    $.validator.unobtrusive.adapters.addBool('zipcode', 'validate_zipcode');
</script>

2 个答案:

答案 0 :(得分:10)

我不是肯定的这将与ASP.NET MVC结合使用(稍后我将启动测试项目),但验证允许您set defaults用于所有实例像这样验证:

$.validator.setDefaults({ onkeyup: false });

如果你可以在MVC获得validate上的句柄之前添加该行,它可能会有效,但它会对所有表单中的所有字段禁用onkeyup(根据你的帖子判断,看起来像这样没关系。)

希望有所帮助。

答案 1 :(得分:3)

您可以在开始新请求之前取消ajax请求。您的代码可能类似于:

<script type="text/javascript">
  var request = null;

  $.validator.addMethod("validate_zipcode", function (value, element) {
    if (value == null || value.length == 0) {
        return true;
    }

    if (request != null) {  
      request.abort();
    }

    var isValid = false;
    request = $.ajax({
        async: false,
        dataType: "json",
        url: "/api/iszipvalid/" + value,
        success: function (response) {
            isValid = response;
        }
    });

    return isValid;
  });

  $.validator.unobtrusive.adapters.addBool('zipcode', 'validate_zipcode');
</script>

如果您查看使用firebug进行的调用,这就是jquery UI自动完成功能。