深入ASP.NET MVC Model验证-使用.NET验证特性类指定Mode验证规则

上一篇文章也有介绍使用验证特性类指定Mode验证规则,但是介绍的不是很详细,下面详细深入谈谈如何使用.NET内置验证特性类指定Mode验证规则及自定义符合自己的业务规则的验证特性类的方法。

一、使用内置的.NET验证特性类

在程序集 System.ComponentModel.DataAnnotations.dll, v4.0.0.0中为我们定义很多有用的验证特性类。最常用类如下:

  • CompareAttribute             提供比较两个属性的属性。 
  • CreditCardAttribute         指定数据字段值是信用卡号码。 
  • CustomValidationAttribute     指定自定义的验证方法来验证属性或类的实例。 
  • DataTypeAttribute             指定要与数据字段关联的附加类型的名称。 
  • DisplayAttribute             提供一个通用特性,使您可以为实体分部类的类型和成员指定可本地化的字符串。 
  • EmailAddressAttribute         确认一电子邮件地址。 
  • MaxLengthAttribute             指定属性中允许的数组或字符串数据的最大长度。 
  • MinLengthAttribute             指定属性中允许的数组或字符串数据的最小长度。 
  • PhoneAttribute                 使用电话号码的正则表达式,指定数据字段值是一个格式正确的电话号码。 
  • RangeAttribute                 指定数据字段值的数值范围约束。 
  • RegularExpressionAttribute     指定 ASP.NET 动态数据中的数据字段值必须与指定的正则表达式匹配。 
  • RequiredAttribute             指定需要数据字段值。 
  • UrlAttribute                 提供 URL 验证。


下面我们看看怎么使用这些内置的验证特性类来定义我们Model类,并让它字段必须满足一定的规则:


 
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel.DataAnnotations;
  4. using System.linq;
  5. using System.Web;
  6. namespace mvcModelBindingDemo.Models
  7. {
  8. public class Appointment
  9. {
  10. [Required(ErrorMessage="ClientName为必填项目")]
  11. public string ClientName { get; set; }
  12. [DataType(DataType.Date)]
  13. public DateTime Date { get; set; }
  14. public bool TermsAccepted { get; set; }
  15. }
  16. }
上面规定即为:CientName为必填,Date为日期类型。


二、扩展内置的.NET验证特性类

2、1、自定义一个属性验证特性类

下面我们定义FutureDateAttribute来验证一个字段必须为日期且其值必须大于当前时间。


 
  1. using System;
  2. using System.ComponentModel.DataAnnotations;
  3. namespace MVCModelBindingDemo.Infrastructure {
  4. public class FutureDateAttribute : RequiredAttribute {
  5. public override bool IsValid(object value) {
  6. return base.IsValid(value) && ((DateTime)value) > DateTime.Now;
  7. }
  8. }
  9. }
我们自定义的这个特性类FutureDateAttribute是继承于内置的.NET验证特性类RequiredAtrribute并重写了其方法IsValid,使其不仅要验证它为必填项且是未来的某个日期。


定义好了这个特性类,使用和内置的验证特性类没有区别。如下:


 
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel.DataAnnotations;
  4. using System.Linq;
  5. using System.Web;
  6. namespace MVCModelBindingDemo.Models
  7. {
  8. public class Appointment
  9. {
  10. [Required(ErrorMessage="ClientName为必填项目")]
  11. public string ClientName { get; set; }
  12. [DataType(DataType.Date)]
  13. [FutureDate(ErrorMessage="请输入一个未来的日期")]
  14. public DateTime Date { get; set; }
  15. public bool TermsAccepted { get; set; }
  16. }
  17. }
2.2、自定义一个Model验证特性类


除了定义一个针对某个字段进行验证的的特性类,我们还可以自定义一个Model验证特性类,在里面依次进行验证每个字段。下面定义一个Model验证特性类NoJoeOnMondaysAttribute用来验证,当ClientName为Joe时,Date不能为星期天。


 
  1. using System;
  2. using System.ComponentModel.DataAnnotations;
  3. using MVCModelBindingDemo.Models;
  4. namespace ModelValidation.Infrastructure {
  5. public class NoJoeOnMondaysAttribute : ValidationAttribute {
  6. public NoJoeOnMondaysAttribute() {
  7. ErrorMessage = "Joe cannot book appointments on Mondays";
  8. }
  9. public override bool IsValid(object value) {
  10. Appointment app = value as Appointment;
  11. if (app == null || string.IsNullOrEmpty(app.ClientName) ||
  12. app.Date == null) {
  13. //当没model为空或者没有ClientName为空或Date为null直接返回true
  14. return true;
  15. } else {
  16. return !(app.ClientName == "Joe" &&
  17. app.Date.DayOfWeek == DayOfWeek.Monday);
  18. }
  19. }
  20. }
  21. }



在Model中定义使用这个Model验证特性类:


 
  1. using System;
  2. using System.ComponentModel.DataAnnotations;
  3. using MVCModelBindingDemo.Infrastructure;
  4. namespace MVCModelBindingDemo.Models
  5. {
  6. [NoJoeOnMondays]
  7. public class Appointment
  8. {
  9. [Required(ErrorMessage="ClientName为必填项目")]
  10. public string ClientName { get; set; }
  11. [DataType(DataType.Date)]
  12. [FutureDate(ErrorMessage="请输入一个未来的日期")]
  13. public DateTime Date { get; set; }
  14. public bool TermsAccepted { get; set; }
  15. }
  16. }



三、MVC 中定义自验证Model

什么是自验证Model呢?简单的说就是Model验证的逻辑放在Model类中,如下面的代码:


 
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel.DataAnnotations;
  4. using MVCModelBindingDemo.Infrastructure;
  5. namespace MVCModelBindingDemo.Models {
  6. public class Appointment : IValidatableObject {
  7. public string ClientName { get; set; }
  8. [DataType(DataType.Date)]
  9. public DateTime Date { get; set; }
  10. public bool TermsAccepted { get; set; }
  11. public IEnumerable<ValidationResult> Validate(ValidationContext
  12. validationContext) {
  13. List<ValidationResult> errors = new List<ValidationResult>();
  14. if (string.IsNullOrEmpty(ClientName)) {
  15. errors.Add(new ValidationResult("Please enter your name"));
  16. }
  17. if (DateTime.Now > Date) {
  18. errors.Add(new ValidationResult("Please enter a date in the future"));
  19. }
  20. if (errors.Count == 0 && ClientName == "Joe"
  21. && Date.DayOfWeek == DayOfWeek.Monday) {
  22. errors.Add(
  23. new ValidationResult("Joe cannot book appointments on Mondays"));
  24. }
  25. if (!TermsAccepted) {
  26. errors.Add(new ValidationResult("You must accept the terms"));
  27. }
  28. return errors;
  29. }
  30. }
  31. }
从上面我们可以看到在定义Model类Appointment的时使用了接口IValidatableObject,而要在Appoint类中实现一个接口中的方法Validate,返回一个IEnumerable<ValidationResult>类型的集合。


当MVC框架的model binder为我们model的每个属性赋好值之后,这个Validate方法将会被调用。可能有的人不喜欢把验证逻辑放在Model中,因为他们这样违反了Model的单一职责性,但是我觉得在MVC架构中这样把验证逻辑放在model中其实也不失一种不错的选择,这样充分的发挥了MVC中三大重要元素这一的Model重要作用。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值