【问题标题】:Validate a field inside a validation function在验证函数中验证字段
【发布时间】:2018-09-10 16:35:17
【问题描述】:

这和这个问题有关:Validation for selecting a minimum and maximum

所以我有两个字段,一个用于最小值,一个用于用户必须输入的最大值。我需要在这两个字段上验证它们是正确的 minim

我有以下代码

$.validator.addMethod('lessthan', function (value, element, params) {
  var greatElement, validator, less, greatText, isEqualValid, great;

  greatElement = $(params[0]);
  // This code does not work
  //validator = $( greatElement[0].form ).validate();
  //validator.element(greatElement);

  // This code does not work
  greatElement.valid();

  // validate the current value 
  // missing for brevety  
});

$.validator.unobtrusive.adapters.add('lessthan', ['compareto', 'isequalvalid'], function (options) {
  var element = $(options.form).find('input[name=' + options.params['compareto'] + ']')[0];
  options.rules['lessthan'] = [element, options.params['isequalvalid']];
  options.messages['lessthan'] = options.message;
});

但是,当我尝试验证当前字段的另一个字段时,即使 aria-invalid 不正确,输入验证错误类也不会被删除。

如何触发验证函数中其他字段的验证?

更新 我应该提到,我需要解决的情况是当我更改其中一个字段(keyup 或 lostfocus)时执行验证。

示例:我有最少 2 个和最多 5 个。 我将 min 更改为 23 两个字段都变得无效并具有与它们关联的错误类 我将 min 更改为 3 只有 max 字段才有效。 min 字段仍然无效,即使验证函数返回有效。

【问题讨论】:

  • 请使用正确的标签。如果您还依赖 Unobtrusive Validation 插件作为 ASP 框架的一部分,这不仅仅是一个 jQuery Validate 问题。编辑标签。
  • 为什么要删除 ASP 标签?您不想从最有可能帮助您的人那里获得帮助吗?
  • 您还需要向我们展示自定义 ValidationAttribute 的代码,以及您如何应用于模型属性
  • 你为什么需要那个。我只需要客户端上的解决方案:所以只在 jquery 上。服务器端并不重要。
  • ASP 框架构造数据属性,供客户端验证使用。 Unobtrusive Validation 插件是 ASP 框架独有的。当使用带有 Unobtrusive Validation 的 ASP 框架时,jQuery Validate 只能通过 Unobtrusive Validation 插件进行初始化。最重要的是,您的问题可能是少数(如果不是唯一的话)关于 SO 的问题之一,该问题标记为不显眼的验证,而不是指示其操作的框架。如果您需要好的帮助,请正确标记问题,以便最了解这些事情的人可以实际看到它。

标签: jquery jquery-validate unobtrusive-validation


【解决方案1】:

经过进一步调查,我发现了我的问题。似乎当您在内部调用 validator.element 函数时,它设置了一个属性 currentElements。因此,基本上您正在更改正在验证的当前元素。

所以为了解决我的问题,我将 currentElements 设置回正在验证的元素

$.validator.addMethod('lessthan', function (value, element, params) {
  var greatElement, validator, less, greatText, isEqualValid, great;

  greatElement = $(params[0]);
  validator = $( greatElement[0].form ).validate();
  validator.element(greatElement);
  // THIS IS THE LINE ADDED
  validator.currentElements = $(element);

  // validate the current value 
  // missing for brevety  
});

$.validator.unobtrusive.adapters.add('lessthan', ['compareto', 'isequalvalid'], function (options) {
  var element = $(options.form).find('input[name=' + options.params['compareto'] + ']')[0];
  options.rules['lessthan'] = [element, options.params['isequalvalid']];
  options.messages['lessthan'] = options.message;
});

你当然可以在调用validator.element之前获取之前的currentElements,并在调用之后将其设置回来。

可能有组的替代方案,但似乎 html5 标记不支持组,因此实现起来可能比较棘手。

更新正确的解决方案

由于我没有使用 form.validate(settings) 并且 html5 标签不支持这些组,因此我不得不实施替代解决方案:

$(document).ready(function () {
  $('[data-val-lessthan-groupname]').each(function () {
     var validator = $(this.form).validate();
     validator.groups[this.name] = $(this).data('val-lessthan-groupname');
     validator.invalid[this.name] = true;
  });
});

所以基本上我为最小值和最大值设置了一个组名。在准备好的文档中,我正在获取验证器并为表单元素设置组名。另外我设置元素是有效的,否则验证只会在元素“验证”后执行(在控件中设置焦点并失去焦点或提交)[似乎该组仅使用 required_from_groups 开发请注意,如果其他字段的值发生变化,它会验证其他字段]

【讨论】:

  • 经过进一步调查,这似乎不是正确的解决方案。调用 validator.element 会重置一些内部值,如果您有其他规则,它们将被忽略。必须研究组功能。
猜你喜欢
  • 2012-11-04
  • 2010-11-26
  • 1970-01-01
  • 2012-12-06
  • 1970-01-01
  • 1970-01-01
  • 2021-06-02
  • 1970-01-01
  • 2016-10-10
相关资源
最近更新 更多