上一篇文章咱们演示了经过对jquery.validate.unobtrusive.js作点小修改,如何给MVC的验证添点花html
主要仍是修改了onError与onSuccess中的这两个方法jquery
这两个方法也是用来显示/隐藏验证信息的关键代码mvc
我根据本身的理解,把这两个方法加上了详细的中文注释app
请你们多多指正:ide
//每次执行完验证的时候,都会来这里(不论成功或失败) //在这里能够控制验证提示消息的显示或隐藏 //error:包含验证提示消息的标签,是一个Jquery对象 //若是验证经过的话是这样子:<span for="UserCode" generated="true"></span> //若是验证经过的话是这样子:<span for="UserCode" generated="true">UserCode 字段是必需的。</span> //inputElement:当前被验证的input控件 function onError(error, inputElement) { // 'this' is the form element //首先查到显示验证提示信息的容器, //通常是这样子:<span class="field-validation-valid" data-valmsg-for="UserCode" data-valmsg-replace="true"></span> //replace:这个值用来判断容器内的值是否须要被替换 var container = $(this).find("[data-valmsg-for='" + escapeAttributeValue(inputElement[0].name) + "']"), replaceAttrValue = container.attr("data-valmsg-replace"), replace = replaceAttrValue ? $.parseJSON(replaceAttrValue) !== false : null; //显示容器 container.removeClass("field-validation-success field-validation-valid").addClass("field-validation-error"); //把容器跟本次的验证提示信息关联起来(success中会用到) error.data("unobtrusiveContainer", container); if (replace) { //清空容器内容, container.empty(); //而后把本次的提示信息添加到容器中,并清除提示信息的class //注意:若是验证经过的话,还会调用success方法,在success方法中会清空container error.removeClass("input-validation-error").appendTo(container); } else { //不清空容器,只是隐藏容器中的验证提示信息 error.hide(); } }
//验证经过后,来这里 //error:验证经过后的提示信息,其实就是<span for="UserCode" generated="true"></span>,跟onError中上的error是同一个东西 function onSuccess(error) { // 'this' is the form element //获取容器(在onError中已经放进error.data中了) var container = error.data("unobtrusiveContainer"), replaceAttrValue = container.attr("data-valmsg-replace"), replace = replaceAttrValue ? $.parseJSON(replaceAttrValue) : null; if (container) { //隐藏容器 container.addClass("field-validation-success").removeClass("field-validation-error field-validation-valid"); //移除容器跟提示信息的关联 error.removeData("unobtrusiveContainer"); if (replace) { //清除容器 container.empty(); } } }
上面有个变量replace变量我没有解释,如今在这里单独说一下:ui
咱们在view中用@Html.ValidationMessageFor方法生成显示验证消息的容器时,注意一下第二个参数this
若是不带第二个参数spa
@Html.ValidationMessageFor(model => model.UserCode)
生成的html是这样子的,这是一个空容器code
<span class="field-validation-valid" data-valmsg-for="UserCode" data-valmsg-replace="true"></span>
若是传入第二个参数orm
@Html.ValidationMessageFor(model => model.UserCode, "请输入用户名")
生成的htm是这样子的,再也不是空容器了,在验证不经过的时候,会直接显示容器里面的信息而忽略Model中定义的验证信息
<span class="field-validation-valid" data-valmsg-for="UserCode" data-valmsg-replace="false">请输入用户名</span>
如今一目了然了吧.