如何覆盖一种形式的成功行为?

How to override success behavior for one form?

我们正在研究 Asp.Net MVC,使用 JQuery ValidationBootstrapjquery.validate.unobtrusive 在我们的表单中显示成功和错误状态。这或多或少是我们默认的配置:

jQuery.validator.setDefaults({
        ignore: "",
        validClass: "has-success",
        errorClass: "has-error",
        highlight: function(element, errorClass, validClass) {           
                $(element).addClass(errorClass).removeClass(validClass);
                $(element).closest('.form-group').removeClass(validClass).addClass(errorClass);                
            }
        },
        unhighlight: function(element, errorClass, validClass) {            
                $(element).removeClass(errorClass).addClass(validClass);
                $(element).closest('.form-group').removeClass(errorClass).addClass(validClass);
            }
        }
    });

为页面上的特定表单覆盖此设置的正确方法是什么?我不想完全覆盖默认值。

这是我只想对一页中的一个表单进行的更改(用户请求不同的行为)。表单没有验证器,所以它永远不会 shows/uses 错误样式,但是当用户在字段上选择一个值时,无论如何都会出现 "success" 样式,我们不想显示也可以。

覆盖页面上特定表单的突出显示和取消突出显示行为的正确方法是什么?

正确的方法是:

  • .setDefaults() 用于设置适用于所有表单的选项。

  • .validate() 用于设置仅适用于一种特定形式的选项。 .validate() 用于初始化表单上的插件,并在所有情况下以一种或另一种方式被调用。

如果您将 ASP 与 Unobtrusive Validation 插件一起使用,那么除了删除 Unobtrusive 插件外,您别无选择。由于 Unobtrusive 自动构造 .validate() 方法,您不能再次调用它,因为 Validate 插件不允许多次进行此初始化。如果您在使用 Unobtrusive 的同时尝试自己调用 .validate(),您的 .validate() 调用将被忽略。典型的解决方法是使用 .setDefaults() 设置自定义选项,但是,如您所知,这始终适用于页面上的所有表单。

感谢@Sparky 帮助我更好地理解问题!

正如他所说,对于大多数情况,如果您有 jquery.validatejquery.validate.unobtrusive 并且您需要覆盖页面中只有一个表单的默认设置,您要么必须:

  • 为所有表单覆盖它们
  • 或删除 jquery.validate.unobtrusive 并分别配置每个表单。

但是,following this post 我意识到您可以使用表单的验证对象(一旦创建)覆盖某些内容。

link 中的示例不起作用,可能是因为当他试图覆盖事件时,原始事件已经附加。

但是在我的情况下,问题可以通过更改 validClass 设置来解决。

$(document).ready(function () {
    // get the validator instance
    var validate = $(".my-form").validate();

    // overwrite validClass
    validate.settings.validClass = "";
}