【问题标题】:How to revalidate the form with jQuery after rules has been added/removed?添加/删除规则后如何使用 jQuery 重新验证表单?
【发布时间】:2015-07-24 17:26:46
【问题描述】:

我正在使用带有验证和不显眼的验证插件的 jQuery 作为 ASP.NET MVC 5 堆栈的一部分。

我的表单由所谓的“表单组”(一组字段)组成,并且我有一个复选框,用于控制应该启用/禁用哪个表单组。

我有两个表单组,两个组都有自己的必填字段。

当我修改复选框选中状态时,我必须启用/禁用组 - 并为每个组动态添加/删除所需的验证规则。

不幸的是,验证消息和错误类没有从表单中删除。

我试图通过重新验证表单/重置表单来手动删除它 - 直到现在都没有运气。

function enablePersonGroup() {
    app.enableFormGroup('.person-group');
    $('input[name=catalogValueId]').rules('add', { 
         required: true, 
         messages: { 
             required: requiredErrorMessage 
         } 
    });
}

function disablePersonGroup() {
    app.disableFormGroup('.person-group');

    // I CAN REMOVE THE RULES, BUT THE ERROR MESSAGE REMAINS:
    //$('input[name=catalogValueId]').rules('remove', 'required'); 
    delete $('form').validate().settings.rules['catalogValueId'];
}

 $(selector).change(function () {
     var type = $(selector+ ':checked').val();
     switch (type) {
         case 'Anonym':
             enableAnonymGroup();
             disablePersonGroup();
             break;
         case 'Person':
             disableAnonymGroup();
             enablePersonGroup();
             break;
     }
     $("form").validate().resetForm(); // DOESN'T HELP, ERROR MESSAGE REMAINS
});

【问题讨论】:

  • 有几个选项取决于 UI,但这里真正的问题是它没有解决服务器端验证。而是在您的属性上使用具有相似属性的foolproof [RequiredIf],这样您就无需任何额外代码即可获得服务器和客户端验证。
  • “真正的问题是它没有解决服务器端验证问题” - 不,服务器端验证工作得很好,我正在使用 FluentValidation。不幸的是,FluentValidation 不能自动解决这些条件规则的客户端验证问题,这就是为什么我也必须在客户端重新实现这些特殊规则。
  • 提及您使用 FluentValidation 会很有用:)。 this article 中显示了一种处理方法

标签: javascript jquery asp.net-mvc forms jquery-validate


【解决方案1】:

在动态更新规则后,如果表单有任何未决错误,您必须使用the .valid() method 以编程方式触发验证测试,或者附加到整个表单,或者附加到单个字段。通过这样做,任何错误消息都将被相应地更新或删除。

触发对整个表单的验证测试。类似于单击提交按钮时发生的情况。

$('#myform').valid();

触发对输入元素的验证测试。与您离开焦点时发生的情况类似。

$('input[name="myinput"]').valid();

如果您需要附加到多个输入元素的选择器,那么您需要一个 jQuery .each()

$('.myInputs').each(function() {
    $(this).valid();
});

【讨论】:

  • 谢谢,但我已经尝试过了,这不起作用......目前我正在尝试使用“depends”(条件验证规则)来解决这个问题,但没有运气......跨度>
  • @Zsolt,这个方法很好用。 “不工作”是什么意思?
  • 这种方法不会隐藏“过时”的字段验证错误,我猜这些错误是由不显眼的验证插件填充的。
  • 这还有另一个缺点,就是(讽刺地)它会触发表单上的验证。这意味着每当您更改复选框中的选择时,都会启用新控件,并且所有这些新控件的必填字段将立即变为“红色”,因为您刚刚触发了整个表单的验证。当然,我可以只为禁用的控件触发验证,以摆脱它们的禁用状态。但我觉得这个解决方案太hacky了。我真正需要的是以某种方式重置整个验证,因为我会在第一次加载后看到表单。
  • @Zsolt,要重置表单的验证,您应该使用.resetForm() 方法。为什么它不适合你是一个谜,因为它就是这样做的。控制台中是否有任何 JavaScript 错误? jsfiddle.net/jjpxxz8t
猜你喜欢
  • 2020-11-14
  • 2015-08-22
  • 1970-01-01
  • 2010-12-03
  • 1970-01-01
  • 1970-01-01
  • 2016-02-07
  • 1970-01-01
  • 2010-09-21
相关资源
最近更新 更多