我有一个搜索表单基于挖空的网格结果。当执行搜索时,在asp.net mvc上进行一些服务器端验证,如果模型状态无效,则通过JSON返回模型错误列表。
我已经设置了jQuery验证,并使用jquery.unobtrusive插件自动映射默认验证(regex,required等)。
我发现$ .validate()。showErrors({prop:error})作为一种方式来动态显示基于服务器的json响应的错误,但我认为这不是正确的方式来使用它来显示服务器验证消息,因为字段不能以后重置(输入验证错误类不会删除)。
我需要一个工作方法设置&重置客户端上的错误(如果存在于$ .validate中)。
有我的问题在jsFiddle的例子:http://jsfiddle.net/goranobradovic/ughCm/
这是因为showErrors函数不添加任何通过验证触发的规则,所以字段保持’有效’,并且不在用于resetForm的elements()列表中从无效字段中删除输入验证错误类。
基本上,我想要简单的方法添加/删除验证规则与自定义消息,从来不满足客户端,以避免表单提交时,我手动设置错误,并删除错误消息删除无效类。
解决方法
我已经解决了这个重写showErrors函数在jQuery验证器与我自己的,这是兼容unobtrusive生成的验证跨度,并清理有效的字段有无效的类。这不是很好的解决方法,但它的工作原理。
这里是jsfiddle与解决方案:http://jsfiddle.net/goranobradovic/ughCm/5/
更新:由于链接到外部网站是不正确的回答,根据网站的指导方针,我在这里添加代码示例。对于任何已经熟悉jQuery验证的人,只需看看showErrors函数中的两行代码。我将它分配给验证器validator.settings.showErrors = showErrors ;.
HTML:
<form id="experiment" action="/" method="post"> <fieldset> <legend></legend> <div class="editor-label"> <label for="Email">Email</label> </div> <div class="editor-field"> <input data-val="true" data-val-email="&#39;Email&#39; not valid email address." data-val-required="&#39;Email&#39; is mandatory." id="Email" name="Email" type="text" value=""><span class="field-validation-valid" data-valmsg-for="Email" data-valmsg-replace="true"></span> </div> <div class="editor-label"> <label for="FirstName">First name</label> </div> <div class="editor-field"> <input class="text-Box single-line" id="FirstName" name="FirstName" type="text" value=""> <span class="field-validation-valid" data-valmsg-for="FirstName" data-valmsg-replace="true"></span> </div> <div class="editor-label"> <label for="LastName">Last name</label> </div> <div class="editor-field"> <input class="text-Box single-line" id="LastName" name="LastName" type="text" value=""> <span class="field-validation-valid" data-valmsg-for="LastName" data-valmsg-replace="true"></span> </div> </fieldset> <p> <button type="submit" class="save ui-button ui-widget ui-state-default ui-corner-all ui-button-text-icon-secondary" value="Save" role="button" aria-disabled="false"><span class="ui-button-text">Save</span><span class="ui-button-icon-secondary ui-icon ui-icon-disk"></span></button> </p> </form> <br/> <button id="add">Add error</button> <button id="remove">Remove error</button> <br/> <br/> Debug: <div id="debug"></div>
JavaScript:
var validator = {}; function addError(e) { validator.showErrors({ "FirstName": "test error" }); } function removeError(e) { validator.showErrors({ "FirstName": null }); fixValidFieldStyles($("form"),validator); } $(document).ready(function() { var $form = $("#experiment"); // prevent form submission $form.submit(function(e) { e.preventDefault(); return false; }); $("#add").click(addError); $("#remove").click(removeError); $("#debug").html("<h1>Validator properties:</h1>"); validator = $form.validate(); validator.settings.showErrors = showErrors; for (var i in validator) { var row = $("<span></span>").html(i).append("<br/>"); $("#debug").append(row); } }); function showErrors(errorMessage,errormap,errorlist) { var val = this; errormap.forEach(function(error,index) { val.settings.highlight.call(val,error.element,val.settings.errorClass,val.settings.validClass); $(error.element).siblings("span.field-validation-valid,span.field-validation-error").html($("<span></span>").html(error.message)).addClass("field-validation-error").removeClass("field-validation-valid").show(); }); } function fixValidFieldStyles($form,validator) { var errors = {}; $form.find("input,select").each(function(index) { var name = $(this).attr("name"); errors[name] = validator.errorsFor(name); }); validator.showErrors(errors); var invalidFields = $form.find("." + validator.settings.errorClass); if (invalidFields.length) { invalidFields.each(function(index,field) { if ($(field).valid()) { $(field).removeClass(validator.settings.errorClass); } }); } }