验证其他字段而不会导致无限循环

时间:2011-09-12 16:30:28

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

我有一种情况,我正在创建一个不显眼的验证器,只有在验证字段不为空时才必须验证另一个字段是必需的(反之亦然)。问题是有一些边缘情况,其他字段没有重新验证,我想强制它重新验证自己而不会导致无限循环。

我的验证方法如下:

$.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;
}

但是这会导致一个无限循环,因为每次通过它都会调用另一个循环。

如何在不调用原始字段的情况下让其他字段进行验证?

2 个答案:

答案 0 :(得分:1)

尝试在添加此验证方法的脚本中添加变量jqip_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;
}

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

答案 1 :(得分:0)

您可以为每个字段添加is_validating属性,以便在您跳过验证时跳过验证,如果没有,则将其设置为true,进行验证然后清除它。