Asp.net mvc 3 验证其他字段而不导致无限循环

Asp.net mvc 3 验证其他字段而不导致无限循环,asp.net-mvc-3,jquery-validate,unobtrusive-validation,Asp.net Mvc 3,Jquery Validate,Unobtrusive Validation,我有一种情况,我正在创建一个不引人注目的验证器,它必须验证另一个字段是否是必需的,前提是验证的字段不是空的(反之亦然)。问题是,在某些边缘情况下,另一个字段不会重新验证,我想强制它重新验证自身,而不会导致无限循环 我的验证方法如下所示: $.validator.addMethod("jqiprequired", function (value, element, params) { if (!this.optional(element) || (this.optional(params)

我有一种情况,我正在创建一个不引人注目的验证器,它必须验证另一个字段是否是必需的,前提是验证的字段不是空的(反之亦然)。问题是,在某些边缘情况下,另一个字段不会重新验证,我想强制它重新验证自身,而不会导致无限循环

我的验证方法如下所示:

$.validator.addMethod("jqiprequired", function (value, element, params) {
    if (!this.optional(element) || (this.optional(params) && this.optional(element))) {
        return true;
    }

    return false;
});
params是我的另一个字段(都是文本框)。如果两者都为空,则传递;如果两者都有值,则传递。只有当只有一个值时,它才会失败

这可以很好地工作,但如果一个字段为空,而另一个字段有值,则使用值从字段中删除该值,空字段不会重新验证(因为它的值没有更改)

我试着这样做:

if (!this.optional(element) || (this.optional(params) && this.optional(element))) {
    $('form').validate().element(params);
    return true;
}
但这会导致一个无限循环,因为每次它经过时,都会调用另一个循环


如何使另一个字段进行验证而不调用原始字段?

您可以为每个字段添加一个
is\u validating
属性,这样,如果启用该属性,您将跳过验证,如果未启用,则将其设置为true,进行验证,然后将其清除。

而不是为每个字段添加属性,尝试在添加此验证方法的脚本中添加变量
jqip\u validating
。然后,按如下方式更改验证:

var jqip_calledFromOtherValidator = false;
if (jqip_validating) {
    jqip_validating = false;
    jqip_calledFromOtherValidator = true;
}
if (!this.optional(element) || (this.optional(params) && this.optional(element))) {
    if (!jqip_validating && !jqip_calledFromOtherValidator) {
        jqip_validating = true;
        $('form').validate().element(params);
    }
    return true;
}

为了调用另一个验证器,必须满足这两个条件,并且只有当第一个验证器调用第二个验证器时才能满足这两个条件。

是的,我试过了。结果很奇怪。这有点奏效,但验证到处都是,有时在停止前验证20或30次。似乎
.validate()
调用再次验证了整个表单。