jQuery中jQuery不引人注意的自定义适配器和方法

时间:2013-07-23 09:00:44

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

我无法使这个jsFiddle工作,但它可以在浏览器中运行:http://jsfiddle.net/vtortola/jYq2X/

我正在尝试添加新的自定义规则来比较两个字段。自定义适配器工作,正在调用它并设置选项。但是从不调用自定义方法。

我正在DOM准备好这个JS:

$.validator.addMethod("customequal-method", function (val, el, p) {
    var $other = $(el).closest('form').find('input[name=' + p.other + ']'); 
    return $other.length && $other.val() == val;
});

$.validator.unobtrusive.adapters.add("customequal", ["other"],
                                     function (options) {
                                         options.rules["customequal-method"] = options.params;
                                         options.messages["customequal-method"] = options.message;
                                     });



$(function(){
    $.validator.unobtrusive.parse($('#myform'));
    $('[type=button]').click(function(e){e.preventDefault(); $('form').valid();});

    $('input[type=text]').blur();
})

这些是HTML中的字段:

    <input type="text" name="StartDate2" id="StartDate2" value="2"
           data-val="true" data-val-customequal="xx xxx" data-val-customequal-other="EndDate2"/>   
    <input type="text" name="EndDate2" id="EndDate2" value="3"
           data-val="true" data-val-customequal="xx xx" data-val-customequal-other="StartDate2"/> 

我一直在尝试不同的东西,但似乎没有任何效果。

有什么想法吗?

1 个答案:

答案 0 :(得分:6)

你的小提琴无效,因为:

  • 所有代码都在DOM中运行,因此您在名为unobtrusive.adapters.add的unobtrusive.validator插件之后添加自定义unobtrusive.parse(document),该插件在没有自定义验证器的情况下注册所有输入

  • 如果您多次拨打.validate()仅首次注册规则,并且在后续呼叫时不会覆盖它们。因此,虽然您已经在添加了自定义适配器的DOM中再次调用了unobtrusive.parse,但它仍然没有任何效果。

所以你有两种方法可以解决它:

在DOM加载事件之前注册自定义适配器,您可以通过更改小提琴来执行此操作

"No wrap - in <head>"

演示JSFiddle

使用$('#myform').data('validator', null)删除已添加的验证程序对象,然后手动调用unobtrusive.parse

$(function () {
    $('#myform').data('validator', null);

    $.validator.unobtrusive.parse($('#myform'));
    $('[type=button]').click(function (e) {
        e.preventDefault();
        $('form').valid();
    });

    $('input[type=text]').blur();
})

演示JSFiddle