仅在模糊时ASP.NET远程验证?

时间:2011-03-23 15:29:37

标签: asp.net-mvc asp.net-mvc-3

我正在使用MVC 3中的远程验证,但是如果是第二次该字段处于活动状态,它似乎会在我输入内容时触发。问题是我有一个自动完成框,因此他们可能会点击一个结果来填充该字段,MVC将其视为“离开”它。

即使除了自动完成之外,我也不希望它在写作过程中尝试验证。有没有办法可以说“只有在完成输入后n毫秒运行验证”或“仅在模糊时运行验证?”

4 个答案:

答案 0 :(得分:19)

MVC 3依赖于jQuery Validation插件进行客户端验证。您需要将插件配置为不在密钥上验证。

您可以使用

全局关闭它
$.validator.setDefaults({
   onkeyup: false
})

请参阅http://docs.jquery.com/Plugins/Validation/Validator/setDefaults和此处的onkeyup选项http://docs.jquery.com/Plugins/Validation/validate

答案 1 :(得分:2)

为了将来参考,我发现可以与typeWatch插件(http://archive.plugins.jquery.com/project/TypeWatch)结合使用。

基本上你想做的是(在我的情况下是一个slug):

/*Disable keyup validation on focus and restore it to onkeyup validation mode on blur*/
$("form input[data-val-remote-url]").on({
    focus: function () {
        $(this).closest('form').validate().settings.onkeyup = false;
    },
    blur: function () {
        $(this).closest('form').validate().settings.onkeyup = $.validator.defaults.onkeyup;
    }
});

$(function () {
    /*Setup the typeWatch for the element/s that's using remote validation*/
    $("#Slug").typeWatch({ wait: 300, callback: validateSlug, captureLength: 5 });
});

function validateSlug() {
    /*Manually force revalidation of the element (forces the remote validation to happen) */
    var slug = $("#Slug");
    slug.closest('form').validate().element(slug);
}

如果您正在使用vanilla typeWatch插件,则必须为每个元素设置typeWatch,因为typeWatch回调不允许您通过$(this)访问当前元素,它只传递值。

或者,您可以修改typeWatch插件以传入元素(timer.el),然后您可以对所有人应用延迟。

答案 2 :(得分:0)

当弹出自动填充建议列表时,我们遇到了自动完成文本框“DealingWithContactName”的问题。在这里,我们选择动态生成的自动完成列表项,用户单击该项目并将焦点设置到该项目。 50分钟后,我们从文本框中取出焦点。它解决了我们的问题。

$('body').on('click', 'ul.ui-autocomplete li a', function () {

        $('#DealingWithContactName').focus();

        window.setInterval(function () {
            $('#DealingWithContactName').blur();
        }, 50);
});

答案 3 :(得分:0)

由于某种原因(也许是因为与不引人注目的插件发生冲突),hwiechers的答案对我不起作用。取而代之的是,我必须使用.data('validator')(如上所述,in this answer)来获取表单的验证器,并在其上将onkeyup设置为false

var validator = $('#form').data('validator');
validator.settings.onkeyup = false;