ASP.NET MVC中对Model进行分步验证的解决方法
2010-09-27 00:16
519 查看
在我之前的文章: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进行分步验证的解决方法
- 一起谈.NET技术,ASP.NET MVC中对Model进行分步验证的解决方法
- ASP.NET MVC中对Model进行分步验证的解决方法
- ASP.NET MVC中对Model进行分步验证的解决方法
- 解决asp.net mvc UpdateModel更新对象后出现null问题的方法
- 解决asp.net mvc UpdateModel更新对象后出现null问题的方法
- 在Asp.Net MVC中实现RequiredIf标签对Model中的属性进行验证
- 在Asp.Net MVC中实现CompareValues标签对Model中的属性进行验证
- 关于asp.net网站发布后,使用登录控件和注册控件时出现“数据库只读,无法进行数据更新”的解决方法
- ASP.NET MVC 3 loginUrl自动变成Account/Login,并且发生404错误的解决方法
- asp.net MVC 中使用dataannotation验证Model
- ASP.NET MVC以ModelValidator为核心的Model验证体系: ModelValidatorProvider
- 【转】【Asp.Net MVC】asp.net mvc Model验证总结及常用正则表达式
- Asp.net MVC中的全局权限验证方法及实现
- ASP.NET MVC 入门6: model的验证
- ASP.NET MVC 5 (二)动态输出、辅助器方法、模型绑定与添加验证
- ASP.NET MVC Model验证(五)
- asp.net mvc使用的心得和问题的解决方法(陆续更新ing)
- MVC学习笔记之:ASP.NET MVC的客户端验证-jQuery.validate验证集合Model验证中的实现
- ASP.NET MVC Model验证(二)