ASP.NET MVC下的四种验证编程方式
ASP.NET MVC采用Model绑定为目标Action生成了相应的参数列表,但是在真正执行目标Action方法之前,还需要对绑定的参数实施验证以确保其有效性,我们将针对参数的验证成为Model绑定。总地来说,我们可以采用4种不同的编程模式来进行针对绑定参数的验证。
一、手工验证绑定的参数在定义具体Action方法的时候,对已经成功绑定的参数实施手工验证无疑是一种最为直接的编程方式,接下来我们通过一个简单的实例来演示如何将参数验证逻辑实现在对应的Action方法中,并在没有通过验证的情况下将错误信息响应给客户端。我们在一个ASP.NET MVC应用中定义了如下一个Person类作为被验证的数据类型,它的Name、Gender和Age三个属性分别表示一个人的姓名、性别和年龄。 1: public class Person 2: {
3: [DisplayName("姓名")] 4: string Name { get; set; } 5:?
6: [DisplayName("性别")] 7: string Gender { get; set; } 8:?
9: [DisplayName("年龄")] 10: int? Age { get; set; } 11: }
接下来我们定义了如下一个HomeController。在针对GET请求的Action方法Index中,我们创建了一个Person对象并将其作为Model呈现在对应的View中。另一个支持POST请求的Index方法具有一个Person类型的参数,我们在该Action方法中先调用Validate方法对这个输入参数实施验证。如果验证成功(ModeState.IsValid属性返回True),我们返回一个内容为“输入数据通过验证”的ContentResult,否则将此参数作为Model呈现在对应的View中。 3: [HttpGet] 5: { 7: } public ActionResult Index(Person person) 12: Validate(person);
13:?
14: if (!ModelState.IsValid) 15: {
16: return View(person); 17: }
18: else 19: {
20: return Content("输入数据通过验证"); 21: }
22: }
23:?
24: private void Validate(Person person) 25: {
26: if (string.IsNullOrEmpty(person.Name)) 27: {
28: ModelState.AddModelError("Name","'Name'是必需字段"); 29: }
30:?
31: string.IsNullOrEmpty(person.Gender)) 32: {
33: ModelState.AddModelError("Gender",1)">"'Gender'是必需字段"); 34: }
35: else if (!new string[] { "M",1)">"F" }.Any(g => string.Compare(person.Gender,g,1)">true) == 0)) 36: {
37: ModelState.AddModelError("有效'Gender'必须是'M','F'之一"); 38: }
39:?
40: null == person.Age) 41: {
42: ModelState.AddModelError("Age",1)">"'Age'是必需字段"); 43: }
44: if (person.Age > 25 || person.Age < 18) 45: {
46: ModelState.AddModelError("有效'Age'必须在18到25周岁之间"); 47: }
48: }
49: }
如上面的代码片断所示,我们在Validate该方法中我们对作为参数的Person对象的3个属性进行逐条验证,如果提供的数据没有通过验证,我们会调用当前ModelState的AddModelError方法将指定的验证错误消息转换为ModelError保存起来。我们采用的具体的验证规则如下。
如下所示的是Action方法Index对应View的定义,这是一个Model类型为Person的强类型View,它包含一个用于编辑人员信息的表单。我们直接调用HtmlHelper<TModel> 的扩展方法EditorForModel将作为Model的Person对象以编辑模式呈现在表单之中。 2: <html>
8: @using (Html.BeginForm()) 10: div>@Html.LabelFor(m=>m.Name) 11: >@Html.EditorFor(m= 12: 16: >m.Age) 17: > m.Age) 18: 20: } 1: [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field,AllowMultiple = false)]
3: { 6: public DomainAttribute(string value) 8: this.Values = value }; 10:? 12: { 14: } 16: override bool IsValid(object 17: { 21: } 23: } 25: string FormatErrorMessage(string name) 27: string[] values = this.Values.Select(value => string.Format("'{0}'",1)">value)).ToArray(); 29: } 4: [Required(ErrorMessageResourceName = "Required",ErrorMessageResourceType = typeof(Resources))] 7: [DisplayName( 8: [Required(ErrorMessageResourceName = 9: [Domain("F",1)">"m",1)">"f",ErrorMessageResourceName = "Domain",1)"> 11:? 3: //其他成员
6: { 9: 10: }
13: 14: }
16: } 三、让数据类型实现IValidatableObject接口 除了将验证规则通过ValidationAttribute特性直接定义在数据类型上并让ASP.NET MVC在进行参数绑定过程中据此来验证参数之外,我们还可以将验证操作直接定义在数据类型中。既然我们将验证操作直接实现在了数据类型上,意味着对应的数据对象具有“自我验证”的能力,我们姑且将这些数据类型称为“自我验证类型”。这些自我验证类型是实现了具有如下定义的接口IValidatableObject,该接口定义在“System.ComponentModel.DataAnnotations”命名空间下。 3: IEnumerable<ValidationResult> Validate(ValidationContext validationContext);
class Person: IValidatableObject 13: { 15: null == person)
17: yield break; if( 20: {
,1)">string[]{"Name"});
24: 25: {
,1)">"Gender" }); "F"}.Any(g=> 29: {
,1)"> 31: } 33: 34: {
,1)">"Age" }); 37: 38: {
,1)"> 40: } 42: } 如上面的代码片断所示,我们让Person类型实现了IValidatableObject接口。在实现的Validate方法中,我们从验证上下文中获取被验证的Person对象,并对其属性成员进行逐个验证。如果数据成员没有通过验证,我们通过一个ValidationResult对象封装错误消息和数据成员名称(属性名),该方法最终返回的是一个元素类型为ValidationResult的集合。在不对其他代码作任何改动的情况下,我们直接运行该程序并在输入不合法数据的情况下提交表单后依然会得到如图1所示的输出结果。 四、让数据类型实现IDataErrorInfo接口上面我们让数据类型实现IValidatableObject接口并将具体的验证逻辑定义在实现的Validate方法中,这样的类型能够被ASP.NET MVC所识别,后者会自动调用该方法对绑定的数据对象实施验证。如果我们让数据类型实现IDataErrorInfo接口也能实现类似的自动化验证效果。 IDataErrorInfo接口定义在“System.ComponentModel”命名空间下,它提供了一种标准的错误信息定制方式。如下面的代码片段所示,IDataErrorInfo具有两个成员,只读属性Error用于获取基于自身的错误消息,而只读索引用于返回指定数据成员的错误消息。 string Error { get; }
5: } 同样是针对上面演示的实例,现在我们对需要被验证的数据类型Person进行了重新定义。如下面的代码片断所示,我们让Person实现了IDataErrorInfo接口。在实现的索引中,我们将索引参数columnName视为属性名称,根据它按照上面的规则对相应的属性成员实施验证,并在验证失败的情况下返回相应的错误消息。在不对其他代码作任何改动的情况下,我们直接运行该程序并在输入不合法数据的情况下提交表单后依然会得到如图1所示的输出结果。 12: [ScaffoldColumn( 13: string Error { get; 14:?
16: { 18: { 20: { 22: { 24: { ; 27: null;
29: "Gender":
31: this.Gender))
33: "'性别'是必需字段";
35: string.Compare(this.Gender,1)"> 36: { ; 39: 40: }
42: { 44: { ; 47: this.Age > 25 || this.Age < 18) 49: "'年龄'必须在18到25周岁之间";
50: }
51: 52: } 53: default: 54: 55: }
56: }
57: }
58: }
ASP.NET MVC下的四种验证编程方式[续篇] (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net – Response.Redirect(“SomeURL”,false)的有效用
- asp.net-core – 编译netcoreapp1.0,代码包含#if!NETSTAND
- asp.net – Dotnetopenauth,从facebook范围检索电子邮件
- asp.net-core – 在强类型视图中呈现ViewComponent的Invali
- asp.net-mvc – 使用Ninject重构依赖注入的ASP.NET MVC代码
- asp.net-mvc – ASP.NET MVC 3自定义HTML助手 – 最佳实践/
- asp.net-mvc – 如何在Kendo模板中动态设置列
- asp.net – 在asp:Button中包装文本
- Asp.NET控制文件上传的大小方法(超简单)
- asp.net – 黑客正试图在我们的某个网站上做某事
- 如何在回发asp.net按钮之前运行javascript函数?
- asp.net – MVC3 Razor – 到期页面
- 基于MetadataType的ASP.Net C#验证模型
- asp.net-mvc-3 – ASP.NET MVC强类型HTML帮助程序
- Asp.net下使用Jquery Ajax传送和接收DataTable的
- 将数据从asp.net-mvc传递到javascript的最佳做法
- asp.net – 与Silverlight 5的串行通信(COM端口)
- asp.net – 如何修复此页面的状态信息无效,可能已
- 本地化 – 如何在asp.net mvc中获取客户端区域设
- asp.net – 会话状态,页面生命周期中的应用程序状