【问题标题】:Validate other field without causing infinite loop验证其他字段而不导致无限循环
【发布时间】:2011-09-12 16:30:28
【问题描述】:

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

我的验证方法如下所示:

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

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

如何在不调用原始字段的情况下使其他字段生效?

【问题讨论】:

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


    【解决方案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;
    }
    

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 是的,我试过了。结果很奇怪。它有点工作,但验证无处不在,有时在它停止之前验证 20 或 30 次。 .validate() 调用似乎再次验证了整个表单。
      猜你喜欢
      • 2021-08-14
      • 2015-07-19
      • 2013-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-07
      • 2020-08-27
      • 2021-05-07
      相关资源
      最近更新 更多