jQuery 不显眼的表单验证器在重置表单时不会隐藏错误消息

Posted

技术标签:

【中文标题】jQuery 不显眼的表单验证器在重置表单时不会隐藏错误消息【英文标题】:jQuery unobtrusive form validator is not hiding error messages when resetting the form 【发布时间】:2012-10-26 20:19:38 【问题描述】:

我正在尝试正确验证和重置表单。验证工作正常——成功监控了所需的字段。然而,当我去重置我的表单时——我只看到我的输入的红色背景清晰,而不是验证消息。

根据jQuery validate documentation:

将输入字段重置为其原始值(需要表单插件), 删除指示无效元素的类并隐藏错误消息

以下是我认为与该问题相关的所有信息。如果您还想看其他内容,请告诉我。

这是我在模型中生成 DOM 元素的方法。此元素需要验证:

//Model.ascx
<div class="detailsRow required">
    <%= html.LabelFor(model => model.Site) %>
    <%= Html.DropDownListFor(model => model.SelectedSiteID, new SelectList(Model.Site, "Key", "Value"))%>
    <%= Html.ValidationMessageFor(model => model.SelectedSiteID)%>
</div>

//Model.cs
[DisplayName("Site")]
public List<KeyValuePair<int, string>> Site  get; set; 

[Range(0, int.MaxValue, ErrorMessage = "Site required")]
public int SelectedSiteID  get; set; 

Site 是一个选择列表,它以值 -1 开头。任何其他选择都是有效的。因此,我在从 0 到最大值的范围内进行验证。

javascript 中,当用户按下表单上的“提交”按钮时,我对我的表单运行以下代码:

var form = workflowDialogContent.find('form');
$.validator.unobtrusive.parse(form);
//Maintain a reference to the current formValidator to be able to reset.
var formValidator = $.data(form[0], 'validator');

if (form.valid()) 

当用户按下提交时,表单被验证,如果所选站点的值为 -1,则会显示我的验证消息。

现在,每当更改选择时,我都想重置我的表单。我的逻辑来自:How to clear Jquery validation error messages?

$(window).on('change', '#SelectedSiteID', function () 
    //Returns the formValidator we maintained a reference to.
    var validator = WorkflowDialogBuilder.getCurrentFormValidator();
    validator.resetForm();
    //TODO: resetForm's documentation says that it hides the errors, but I did not experience this, so I am doing it manually.
    //$('.field-validation-error').empty();

但是,当我运行此代码时……高亮显示被删除,但错误消息仍然存在。如果我调用注释代码的位 - 验证错误被隐藏,但下次验证我的表单时它们不会重新出现。

验证后: 调用resetForm后:

任何想法为什么我会看到这种行为?

更新:作为一种变通方法,以下代码似乎可以进行适当的清理:

$('.field-validation-error').empty();

【问题讨论】:

如果我没记错的话,验证不会显示和隐藏错误消息,而只是将文本添加到始终可见的 span 中。为了使您的手动解决方案起作用,只需执行相同操作并手动清空“.field-validation-error”... 至于为什么它不能开箱即用,我不知道... :/ 好主意。这是一个可行的解决方法,可以解决问题,但我会暂时保留它。谢谢! 如果您正在动态加载该对话框表单,您可能会发现这个问题很有用:***.com/questions/4406291/… 对了,你为什么要自己调用 .parse() 方法?这不是微软这个不起眼的库一开始就已经做的事情了吗? Tallmaris 应该更好地表述为更清晰,但他的意思是不显眼的库挂钩到 DOM 就绪事件(与 $(function) 相同)以装配表单本身。这可以在文件的最后找到:$jQval.unobtrusive.parse(document); 【参考方案1】:

字段一更改,为什么不trigger element validation

$('#myFormId input').on('change', function()
    validator.element($(this));
);

【讨论】:

【参考方案2】:

我认为您可以将其添加到您的解决方法中:

var form = $("#MyFormId");
form.find(':input').removeClass("input-validation-error");

问候

【讨论】:

【参考方案3】:

到目前为止给出的答案的唯一问题是所有错误都消失了,而不仅仅是您想要的错误。我在获取地址时遇到了类似的问题,如果状态是 DC,我需要输入象限(NW,NE,SW,SE)。我使用 jquery 添加和删除需求,然后将 @Html.ValidationMessageFor() 包装在 div 中,然后在选择不同状态时简单地隐藏 div。

【讨论】:

【参考方案4】:

你在下面使用,对吗?

var form = workflowDialogContent.find('form');

那么你必须使用

form.resetForm();

要重置表单,它会起作用。

【讨论】:

【参考方案5】:

试试这个。

var validator = $( "#myform" ).validate();
validator.resetForm();

【讨论】:

以上是关于jQuery 不显眼的表单验证器在重置表单时不会隐藏错误消息的主要内容,如果未能解决你的问题,请参考以下文章

使用 Select2 ASP.NET MVC 时进行不显眼的验证

动态局部视图 + jquery 表单劫持 + 客户端验证 = 不工作

使用 jQuery 在 Rails 中不显眼的动态表单字段

jquery:重置后禁用/启用按钮不起作用

自定义 jquery 验证和不显眼的 JavaScript

自定义 jquery 验证和不显眼的 JavaScript