Welcome 微信登录

首页 / 网页编程 / ASP.NET / ASP.NET MVC基于标注特性的Model验证:一个Model,多种验证规则

ASP.NET MVC基于标注特性的Model验证:一个Model,多种验证规则2012-09-26 cnblogs Artech对于Model验证,理想的设计应该是场景驱动的,而不是Model(类型)驱动的,也就是对于同一个Model对象,在不同的使用场景中可能具有不同的验证规则。举个简单的例子,对于一个表示应聘者的数据对象来说,针对应聘的岗位不同,肯定对应聘者的年龄、性别、专业技能等方面有不同的要求。但是ASP.NET MVC的Model验证确是Model驱动的,因为验证规则以验证特性的形式应用到Model类型及其属性上。这样的验证方式实际上限制了Model类型在基于不同验证规则的使用场景中的重用。通过上一篇文章《将ValidationAttribute应用到参数上》的扩展我们将验证特性直接应用在参数上变成了可能,这从一定程度上解决了这个问题,但是只能解决部分问题,因为应用到参数的验证特性只能用于针对参数类型级别的验证,而不能用于针对参数类型属性级别的验证()。

一、同一个Model在采用不同的验证规则

现在我们通过利用对ASP.NET MVC的扩展来实现一种基于不同验证规则的Model验证。为了让读者对这种认证方式有一个感官的认识,我们来看看这个扩展最终实现怎样的验证效果。在通过Visual Studio的ASP.NET MVC 项目模板创建的空Web应用中,我们定义了如下一个Person类型作为Model。

 1: public class Person
2: {
3: [DisplayName("姓名")]
4: public string Name { get; set; }
5: 
6: [DisplayName("性别")]
7: public string Gender { get; set; }
8: 
9: [DisplayName("年龄")]
10: [RangeValidator(10, 20, RuleName = "Rule1",ErrorMessage = "{0}必须在{1}和{2}之间!")]
11: [RangeValidator(20, 30, RuleName = "Rule2", ErrorMessage = "{0}必须在{1}和{2}之间!")]
12: [RangeValidator(30, 40, RuleName = "Rule3", ErrorMessage = "{0}必须在{1}和{2}之间!")]
13: public int Age { get; set; }
14: }
在表示年龄的Age属性上应用了三个RangeValidatorAttribute(不是RangeAttribute),它们对应针对年龄的三种不同的验证规则,RuleName属性表示规则名称。三种验证规则(Rule1、Rule2和Rule3)分别要求年龄分别在10到20、20到30和30到40岁之间。

然后我们定义了具有如下定义HomeController,它具有三组Action方法(Index、Rule1和Rule2)。方法Rule1、Rule2和HomeController类上应用了一个ValidationRuleAttribute特性用于指定了当前采用的验证规则。用于指定验证规则的ValidationRuleAttribute特性可以同时应用于Controller类型和Action方法上,应用于后者的ValidationRuleAttribute特性具有更高的优先级。针对HomeController的定义,Action方法Index、Rule1和Rule2分别采用的验证规则为Rule3、Rule1和Rule2。

 1: [ValidationRule("Rule3")]
2: public class HomeController : RuleBasedController
3: {
4: public ActionResult Index()
5: {
6: return View("person", new Person());
7: }
8: [HttpPost]
9: public ActionResult Index(Person person)
10: {
11: return View("person", person);
12: }
13: 
14: [ValidationRule("Rule1")]
15: public ActionResult Rule1()
16: {
17: return View("person", new Person());
18: }
19: [HttpPost]
20: [ValidationRule("Rule1")]
21: public ActionResult Rule1(Person person)
22: {
23: return View("person", person);
24: }
25: 
26: [ValidationRule("Rule2")]
27: public ActionResult Rule2()
28: {
29: return View("person", new Person());
30: }
31: [HttpPost]
32: [ValidationRule("Rule2")]
33: public ActionResult Rule2(Person person)
34: {
35: return View("person", person);
36: }
37: }
定义在HomeController中的6个方法均将创建的/接收的Person对象呈现到名为Person的View中,该View的定义如下所示。这是一个将Person类型作为Model的强类型View,在该View中我们将作为Model的Person对象以编辑模式呈现在一个表单中,并在表单中提供一个提交按钮。

 1: @model Person
2: @using (Html.BeginForm())
3: {
4: @Html.EditorForModel()
5: <input type="submit" value="保存" />
6: }
现在运行我们的程序,并通过在浏览器中指定相应的地址分别访问定义在HomeController的三个Action(Index、Rule1和Rule2),一个用于编辑个人信息的表单会呈现出来。然后我们根据三个Action方法采用的验证规则输入不合法的年龄,然后点击“保存”按钮,我们会看到输入的年龄按照对应的规则被验证了,具体的验证效果如下图所示。