ASP.NET MVC基于标注特性的Model验证:一个Model,多种验证规则

对于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
验证年龄
,以便于您获取更多的相关知识。

时间: 2024-10-30 08:23:35

ASP.NET MVC基于标注特性的Model验证:一个Model,多种验证规则的相关文章

ASP.NET MVC基于标注特性的Model验证:DataAnnotationsModelValidator

对于ASP.NET MVC基于标注特性的Model验证,很多人只知道应用在数据类型及其属性上用于定义验证规则和错误消息的ValidationAttribute.通过<ASP.NET MVC以ModelValidator为核心的Model验证体系: ModelValidator>的介绍,我们知道了最终用于进行Model验证的是一个叫做ModelValidator的组件.ValidationAttribute对应的ModelValidator为DataAnnotationsModelValidat

ASP.NET MVC基于标注特性的Model验证:DataAnnotationsModelValidatorProvider

DataAnnotationsModelValidator最终是通过它对应的ModelValidatorProvider,即DataAnnotationsModelValidatorProvider创建的.通过前面的介绍我们知道它是AssociatedValidatorProvider的子类,后者在用于获取ModelValidator的GetValidators方法中已经根据指定的Model元数据所有特性创建出来,DataAnnotationsModelValidator只需要从中筛选出继承自V

ASP.NET MVC基于标注特性的Model验证:将ValidationAttribute应用到参数上

ASP.NET MVC默认采用基于标准特性的Model验证机制,但是只有应用在Model类型及其属性上的ValidationAttribute才有效.如果我们能够将ValidationAttribute特性直接应用到参数上,我们不但可以实现简单类型(比如int.double等)数据的Model验证,还能够实现"一个Model类型,多种验证规则",本篇文章将为你提供相关的解决方案(源代码从这里下载). 一.ValidationAttribute本身是可以应用到参数上的 如果你够细心应该会

ASP.NET MVC基于标注特性的Model验证:ValidationAttribute

通过前面的介绍我们知道ModelValidatorProviders的静态只读Providers维护着一个全局的ModelValidatorProvider列表,最终用于Model验证的ModelValidator都是通过这些ModelValidatorProvider来提供的.对于该列表默认包含的三种ModelValidatorProvider来说,DataAnnotationsModelValidatorProvider无疑是最重要的,ASP.NET MVC默认提供的基于数据标注特性的声明式

ASP.NET MVC基于标注特性的Model验证:DataAnnotationsModelValidatorProvider

DataAnnotationsModelValidator最终是通过它对应的ModelValidatorProvider,即DataAnnotationsModelValidatorProvider创建的.通过前面的介绍我们知道它是AssociatedValidatorProvider的子类,后者在用于获取ModelValidator的GetValidators方法中已经根据指定的Model元数据所有特性创建出来,DataAnnotationsModelValidator只需要从中筛选出继承自V

asp.net mvc 在控制器里跳转到另一个区域里的页面

问题描述 asp.net mvc 在控制器里跳转到另一个区域里的页面 请问前辈们 我在控制器想跳到分区里的页面怎么做? 如下:HomeController跳到admin分区的View1.aspx,代码怎么写? 解决方案 return RedirectToAction("Admin", "View1"); 解决方案二: 为何不用 View1.cshtml而是View1.aspx?

Asp.Net Mvc Beta新特性之自动绑定(1)-体验篇

我们知道,在Asp.Net Mvc Preview5中加入了全新的ModelBinder特性,虽然这个特性非常的强大,但是使用起来并不是那么的友好,因此,在最新的Asp.Net Mvc Beta中,框架对这部分进行了进一步的加强,使得复杂参数的自动绑定得以实现,本文将分级部分完整探讨整个mvc框架中的modelbinder实现和完全挖掘系统自带的ModelBinder的能力,使得基于mvc框架的web开发脱离页面取值的苦海. (参见: http://www.cnblogs.com/leven/a

ASP.NET MVC 1.1 _VS2010 &amp; ASP.NET MVC 2 新特性

ASP.NET MVC 1.1 on Visual Studio 2010 Beta1 由于 VS2010 Beta的发布,所以ASP.NET MVC在Codeplex上发布了一个专门为其准备的ASP.NET MVC版本: http://aspnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=28527   关于ASP.NET MVC 2.0   另外在ASP.NET MVC Roadmap 中提到了关于ASP.NET MVC 2.0

Asp.Net Mvc Beta新特性之自动绑定(2)-深入探索篇

在上篇中介绍了自动绑定的基本用法,在本篇中,我们将深入了解自动绑定的工作原理. 自动绑定的确是让人感到兴奋的特性,然而,为了让它可以在我们的项目中更好的工作,我们有必要深入了解如何更进一步细调该特性以及它是如何工作的.而本文正式即将揭开这个谜底. 为了更好的了解该特性,我们有必要到codeplex去下载一份asp.net mvc的源代码并分析之,在本文写作的时候,codeplex上已经放上了beta版的源码,如果想进一步了解的朋友可以下载并对照本文分析. 在beta版中,新增了自动绑定这一特性,