如何覆盖一种表单的成功行为?

Posted

技术标签:

【中文标题】如何覆盖一种表单的成功行为?【英文标题】:How to override success behavior for one form? 【发布时间】:2018-03-16 00:18:30 【问题描述】:

我们正在处理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);
            
        
    );

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

这是我只想对一页中的一个表单进行的更改(用户请求了不同的行为)。该表单没有验证器,因此它从不显示/使用错误样式,但是当用户在字段上选择一个值时,无论如何都会启动“成功”样式,我们也不想显示它。

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

【问题讨论】:

如果上面的代码运行,你一定在某处做$(form).validate()?如果您不想验证它,请停止这样做 疯狂的问题:既然你没有提到任何关于 .validate() 方法的内容,我们可以假设你正在使用带有 Unobtrusive Validation 插件的 ASP 吗? @adeneo,不,我们没有专门调用 .validate() 方法,因为我们使用的是不显眼的验证。 @Sparky 你说得对,我完全是想提这个,但我突然忘记了,我更新了这个问题。 【参考方案1】:

正确的做法是:

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

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

如果您将 ASP 与 Unobtrusive Validation 插件一起使用,那么除了删除 Unobtrusive 插件之外,您没有其他解决方案。由于 Unobtrusive 会自动构造 .validate() 方法,因此您不能再次调用它,因为 Validate 插件不允许此初始化多次发生。如果您在使用 Unobtrusive 的同时尝试自己拨打 .validate(),您的 .validate() 呼叫将被忽略。一个典型的解决方法是使用 .setDefaults() 设置自定义选项,但是,正如您已经了解到的,这始终适用于页面上的所有表单。

【讨论】:

嗨 Sparty,如果我理解正确的话,所以由于我们使用的是 jquery.validate.unobtrusive,所以我们有 2 个选项,或者在该页面中再次设置默认值(这将覆盖所有页面上的表格)。或者从该页面中删除 jquery.validate.unobtrusive 并为其所有表单手动调用 validate(options)?【参考方案2】:

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

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

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

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

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

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

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

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

【讨论】:

以上是关于如何覆盖一种表单的成功行为?的主要内容,如果未能解决你的问题,请参考以下文章

如何覆盖 FOS 用户捆绑表单标签

ColumnSpan在Xamarin表单中的奇怪行为

如何覆盖 Xamarin.IOS UIButton 的 LayoutSublayersOfLayer 行为?

如何覆盖表单的默认值?

如何防止手机键盘覆盖html输入

Django如何覆盖默认表单错误消息