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

时间:2012-11-06 20:02:34

标签: jquery asp.net-mvc asp.net-mvc-3 validation

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

根据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; }

站点是一个以值-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();
}

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

验证后: enter image description here 调用resetForm后: enter image description here

为什么我会看到这样的行为?

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

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

5 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

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

此致

答案 2 :(得分:0)

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

答案 3 :(得分:0)

你在下面使用,对吗?

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

然后你必须使用

form.resetForm();

重置表单,它会起作用。

答案 4 :(得分:0)

尝试一下。

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