对于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方法采用的验证规则输入不合法的年龄,然后点击“保存”按钮,我们会看到输入的年龄按照对应的规则被验证了,具体的验证效果如下图所示。
以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索验证
, model
, public
, view的index表示什么
, 规则
, person
, ValidationRule
, mvc参数验证
, 验证规则
, rules
, rule
验证年龄
,以便于您获取更多的相关知识。