【问题标题】:Stop custom validator from firing on each keystroke阻止自定义验证器在每次击键时触发
【发布时间】:2011-06-25 14:54:27
【问题描述】:

我使用 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>

【问题讨论】:

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


    【解决方案1】:

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

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

    如果您可以在 MVC 获得 validate 的句柄之前添加该行,它可能会起作用,但它会为所有表单中的所有字段禁用 onkeyup(从您的帖子来看,这似乎没问题) .

    希望对您有所帮助。

    【讨论】:

    • 我这样做了,它仍然在每次按键(或退格)时调用验证器方法,但是当我跳出该字段时不是!我还能尝试什么?
    【解决方案2】:

    您可以在开始新的请求之前取消您的 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 自动完成所做的事情。

    【讨论】:

    • 如果我弄错了,请纠正我,但是如果已经在进行中,那只会取消 ajax 请求,对吗?它仍然会尝试在 keyup 而不是 blur 事件上进行验证,但它一次只会拨打一个电话?
    • 是的,这是正确的,据我所知,除了通过 keyup 之外,没有其他方法可以更改验证。可能值得看看新的 Remote 属性,它与您的自定义验证做同样的事情,但这也可以通过取消请求来工作。
    • 我会使用 Remote 属性,但是基于验证会发生很多其他自定义逻辑(设置其他 UI 元素)。我也在另一个字段上实现了这个(电子邮件地址——以确保它不存在),但它在每次击键时都会为它命中数据库。必须有一种方法可以将事件更改为“blur”而不是“keyup”...
    • request.abort();应该为所有 ajax 驱动的验证添加,以防止早期结果覆盖晚期触发器。但是应该通过将整个事物包含在匿名函数中来避免“请求”变量的全局范围放置。
    • 刚刚发现库覆盖 $.ajax 以添加“模式”属性以中止所有待处理的请求。看看 jquery validate 源代码。
    猜你喜欢
    • 2011-12-31
    • 1970-01-01
    • 1970-01-01
    • 2018-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-26
    相关资源
    最近更新 更多