天天看点

ASP.NET MVC中对Model进行分步验证的解决方法

<a></a>

代码

publicclass UserViewModel

{

[DisplayName("step")]

[Required(ErrorMessage ="You must select a step .")]

publicint Step { get; set; }

//个人信息

[Required(ErrorMessage ="姓名不能为空")]

[StringLength(20, ErrorMessage ="姓名长度不能超过20个字符")]

publicstring Name { get; set; }

[RegularExpression(@"120|((1[0-1]|\d)?\d)", ErrorMessage ="年龄格式不对")]

publicint? Age { get; set; }

//职位信息

[Required(ErrorMessage ="职位不能为空")]

publicstring Post { get; set; }

publicint? Salary { get; set; }

//学历信息

[Required(ErrorMessage ="毕业院校不能为空")]

publicstring University { get; set; }

publicint? GraduationYear { get; set; }

//联系信息

[Required(ErrorMessage ="邮件不能为空")]

[RegularExpression(@"^[a-z][a-z|0-9|]*([_][a-z|0-9]+)*([.][a-z|"+@"0-9]+([_][a-z|0-9]+)*)?@[a-z][a-z|0-9|]*\.([a-z]"+@"[a-z|0-9]*(\.[a-z][a-z|0-9]*)?)$", ErrorMessage="邮件格式不正确")]

publicstring Email { get; set; }

publicint? Mobile { get; set; }

public IEnumerable&lt;SelectListItem&gt; StepList { get; set; }

public UserViewModel()

var list =new List&lt;SelectListItem&gt;() {

new SelectListItem { Text ="(Select)" },

new SelectListItem { Value ="1", Text ="Step1" },

new SelectListItem { Value ="2", Text ="Step2" },

new SelectListItem { Value ="3", Text ="Step3" },

new SelectListItem { Value ="4", Text ="Step4" }

};

this.StepList =new SelectList(list, "Value", "Text");

}

实现:

    这篇文章这种情况服务端和客户端的验证都会讲到。为了简化起见,这里我除去的WF的流程功能,直接用下拉框表示,当下拉框选择step1表示填写第一步注册的信息,当下拉框选择step2表示填写第二步注册的信息,当下拉框选择step3表示填写第三步注册的信息,当下拉框选择step4表示填写第四步注册的信息。写得很啰嗦,但是这个很容易实现,我使用Jquery来显示和隐藏下拉框对应的Step。Jquery代码如下:

如下图:

第一步:填写姓名和年龄。

 第二步:填写职位和薪水

 第三步填写:毕业院校和毕业时间

第四步填写:邮箱和电话

    为了实现这样的验证,我们可以将验证的错误信息中移除不在当前步骤填写的字段的错误信息,写一个类InputValidationModelBinder继承DefaultModelBinder并重载OnModelUpdated方法,将不必要的错误信息清除,代码如下:

publicclass InputValidationModelBinder : DefaultModelBinder

protectedoverridevoid OnModelUpdated(ControllerContext controllerContext, ModelBindingContext bindingContext)

var modelState = controllerContext.Controller.ViewData.ModelState;

var valueProvider = controllerContext.Controller.ValueProvider;

var keysWithNoIncomingValue = modelState.Keys.Where(x =&gt;!valueProvider.ContainsPrefix(x));

foreach (var key in keysWithNoIncomingValue)

modelState[key].Errors.Clear();

     上面是服务端的代码,对于客户端,我们都知道asp.net MVC客户端验证时通过MicrosoftMvcValidation.js去实现的。看下面代码。

1 validate: function Sys_Mvc_FormContext$validate(eventName) {

2 var fields =this.fields;

3 var errors = [];

4 for (var i =0; i &lt; fields.length; i++) {

5 var field = fields[i];

6 if (!field.elements[0].disabled) {

7 var thisErrors = field.validate(eventName);

8 if (thisErrors) {

9 Array.addRange(errors, thisErrors);

10 }

11 }

12 }

13 if (this.replaceValidationSummary) {

14 this.clearErrors();

15 this.addErrors(errors);

16 }

17 return errors;

18 }

19 }

在第6行代码加入了一句判断:当页面的元素没有被disabled的时候才去验证。

好了这样就实现了一次只对Model中的几个属性字段进行验证。

运行:

asp.net mvc的验证机制只对model中当前页面的属性进行验证:

填写正确通过验证:

总结:本文解决了我之前遗留下来的一个问题。实现了在ASP.NET MVC中对Model进行多步验证。希望对你有所帮助,如果你有更好的方法,欢迎给我留言。 

本文转自麒麟博客园博客,原文链接:http://www.cnblogs.com/zhuqil/archive/2010/09/27/Mvc-Validation.html,如需转载请自行联系原作者

继续阅读