ASP.NET MVC中对Model进行分步验证的解决方法
2014-06-28 00:04
405 查看
原文:ASP.NET MVC中对Model进行分步验证的解决方法 在我之前的文章:ASP.NET MVC2.0结合WF4.0实现用户多步注册流程中将一个用户的注册分成了四步,而这四个步骤都是在完善一个Model的信息,但是又分页面填写信息的,当时我加上ModelState.IsValid这句验证代码的时候,根本没法通过验证,因为在注册的前面三步,注册用户的Model信息都没填写完整,而ModelState.IsValid是对一个实体的所有属性进行判断验证的。当时很纠结,因为刚接触Asp.net MVC,故没有找到解决方案。这篇文章将给出解决的办法。看下面需要验证的Model的代码如下:
代码
如下图:
第一步:填写姓名和年龄。
第二步:填写职位和薪水
第三步填写:毕业院校和毕业时间
第四步填写:邮箱和电话
为了实现这样的验证,我们可以将验证的错误信息中移除不在当前步骤填写的字段的错误信息,写一个类InputValidationModelBinder继承DefaultModelBinder并重载OnModelUpdated方法,将不必要的错误信息清除,代码如下:
上面是服务端的代码,对于客户端,我们都知道asp.net MVC客户端验证时通过MicrosoftMvcValidation.js去实现的。看下面代码。
在第6行代码加入了一句判断:当页面的元素没有被disabled的时候才去验证。
好了这样就实现了一次只对Model中的几个属性字段进行验证。
运行:
asp.net mvc的验证机制只对model中当前页面的属性进行验证:
填写正确通过验证:
总结:本文解决了我之前遗留下来的一个问题。实现了在ASP.NET MVC中对Model进行多步验证。希望对你有所帮助,如果你有更好的方法,欢迎给我留言。
代码
<script type="text/javascript"> $(function () { $.fn.enable = function () { return this.show().removeAttr("disabled"); } $.fn.disable = function () { return this.hide().attr("disabled", "disabled"); } var dllStep = $("#Step"); var step1 = $("#Step1,#Step1 input"); var step2 = $("#Step2,#Step2 input"); var step3 = $("#Step3,#Step3 input"); var step4 = $("#Step4,#Step4 input"); setControls(); dllStep.change(function () { setControls(); }); function setControls() { switch (dllStep.val()) { case "1": step1.enable(); step2.disable(); step3.disable(); step4.disable(); break; case "2": step1.disable(); step2.enable(); step3.disable(); step4.disable(); break; case "3": step1.disable(); step2.disable(); step3.enable(); step4.disable(); break; case "4": step1.disable(); step2.disable(); step3.disable(); step4.enable(); break; case "": step1.disable(); step2.disable(); step3.disable(); step4.disable(); break; } } }); </script>
如下图:
第一步:填写姓名和年龄。
第二步:填写职位和薪水
第三步填写:毕业院校和毕业时间
第四步填写:邮箱和电话
为了实现这样的验证,我们可以将验证的错误信息中移除不在当前步骤填写的字段的错误信息,写一个类InputValidationModelBinder继承DefaultModelBinder并重载OnModelUpdated方法,将不必要的错误信息清除,代码如下:
public class InputValidationModelBinder : DefaultModelBinder { protected override void OnModelUpdated(ControllerContext controllerContext, ModelBindingContext bindingContext) { var modelState = controllerContext.Controller.ViewData.ModelState; var valueProvider = controllerContext.Controller.ValueProvider; var keysWithNoIncomingValue = modelState.Keys.Where(x => !valueProvider.ContainsPrefix(x)); foreach (var key in keysWithNoIncomingValue) modelState[key].Errors.Clear(); } }
上面是服务端的代码,对于客户端,我们都知道asp.net MVC客户端验证时通过MicrosoftMvcValidation.js去实现的。看下面代码。
validate: function Sys_Mvc_FormContext$validate(eventName) { var fields = this.fields; var errors = []; for (var i = 0; i < fields.length; i++) { var field = fields[i]; if (!field.elements[0].disabled) { var thisErrors = field.validate(eventName); if (thisErrors) { Array.addRange(errors, thisErrors); } } } if (this.replaceValidationSummary) { this.clearErrors(); this.addErrors(errors); } return errors; } }
在第6行代码加入了一句判断:当页面的元素没有被disabled的时候才去验证。
好了这样就实现了一次只对Model中的几个属性字段进行验证。
运行:
asp.net mvc的验证机制只对model中当前页面的属性进行验证:
填写正确通过验证:
总结:本文解决了我之前遗留下来的一个问题。实现了在ASP.NET MVC中对Model进行多步验证。希望对你有所帮助,如果你有更好的方法,欢迎给我留言。
相关文章推荐
- ASP.NET MVC中对Model进行分步验证的解决方法
- ASP.NET MVC中对Model进行分步验证的解决方法
- ASP.NET MVC中对Model进行分步验证的解决方法
- 一起谈.NET技术,ASP.NET MVC中对Model进行分步验证的解决方法
- 在Asp.Net MVC中实现CompareValues标签对Model中的属性进行验证
- 解决asp.net mvc UpdateModel更新对象后出现null问题的方法
- 解决asp.net mvc UpdateModel更新对象后出现null问题的方法
- 在Asp.Net MVC中实现RequiredIf标签对Model中的属性进行验证
- ASP.NET MVC 此安装不支持该项目类型解决方法(转)
- asp.net控件RequiredFieldValidator验证FCKeditor提交两次才能成功的解决方法
- (转)进行ASP.NET Web安全验证方法
- 中文VS2008中安装ASP.NET MVC框架出现问题的解决方法
- ASP.NET MVC结合jQuery插件进行数据验证
- asp.net mvc 2 (.net 4.0) “检测到有潜在危险的 Request.Form 值”的解决方法
- ASP.NET MVC:使用Enterprise Library验证程序块进行验证对象
- ASP.NET MVC运行出现Uncaught TypeError: Cannot set property __MVC_FormValidation of null的解决方法
- ASP.NET MVC结合jQuery插件进行数据验证
- 抛弃TitleContent - Asp.net MVC中页面标题的新解决方法
- (转载)ASP.NET MVC结合jQuery插件进行数据验证
- ASP.net MVC 同一view或页面使用多个Model或数据集的方法