在jQuery不显眼的验证中避免验证循环

时间:2013-07-22 11:40:06

标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-4 unobtrusive-validation unobtrusive-javascript

在我的表单中有两个字段,相互比较以查看它们是否有效:

<input type="text" name="StartDate" id="StartDate" value="2"
       data-val="true" data-val-equalto="xx" data-val-equalto-other="EndDate"/>   
<input type="text" name="EndDate" id="EndDate" value="3"
       data-val="true" data-val-equalto="xx" data-val-equalto-other="StartDate"/> 

当我在StartDate上模糊时,EndDate也会得到验证。所以jQuery设法避免在一个和另一个之间进行验证循环。

现在,我正在尝试在自定义验证规则中实现相同的机制。我从“其他”字段中获取值,如果一切正常,我也会在“其他”中触发验证,但这会在验证循环中结束:

$.validator.addMethod("customequal-method", function (val, el, p) {
    var $other = $(el).closest('form').find('input[name=' + p.other + ']'); 
    if($other.val() == val){        
        try{$other.valid();}
        finally{return true;}
    }
    return false;
});

我怎样才能应用与jQuery相同的方法?我的意思是,考虑到这两个领域:

<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"/> 

我希望在修改EndDate2时,在模糊之后,StartDate2也会得到验证,并且两者都以与jQuery相同的方式生效。

我一直试图在jsFiddle中组合一个例子,但是我不能让我的自定义方法工作:http://jsfiddle.net/vtortola/vu6tm/(如果你发现问题我将非常感激),我开始一个单独的线程关于这个jQuery unobtrusive custom adapter and method in jsFiddle

干杯。

1 个答案:

答案 0 :(得分:1)

您需要一个堆栈才能理解您返回到之前的验证元素。单个值是不够的,因为eache元素可能与其他元素一起涉及其他规则。您可以在闭包中定义包含堆栈的var(isInStack验证元素是否在数组中):

(function () {
var stack = [];
$.validator.addMethod("customequal-method", function (val, el, p) {
var iAmTheRoot = stack.length == 0;
var $other = $(el).closest('form').find('input[name=' + p.other + ']'); 
if($other.val() == val){        
    try{
      if (!isInStack($other[0]) ) $other.valid();
    }
    finally{
    if (iAmTheRoot) stack = [];
    return true;}
}
return false;
});})();