在.NET MVC 中,当页面提交model到Action的时候,自动填充ModelState。使用ModelState.IsValid进行方便快捷的数据验证,其验证也是调用命名空间System.ComponentModel.DataAnnotations中的各种方法进行验证。但是使用非MVC架构时,就需要写很多if判断或者正则表达式,当有多个字段需要验证的的时候不知道有多少人和我一样很厌烦这种用if判断的方式。这里记录一个方法,使用System.ComponentModel.DataAnnotations来实现自己的验证model抛出相应的错误信息。
C#文档地址:System.ComponentModel.DataAnnotations
 
这里我们先实现一个Person类,里面包含几个简单的属性,然后指定几个Attribute
  1. public class Person
  2. {
  3. [Required(ErrorMessage = "{0} 必须填写")]
  4. [DisplayName("姓名")]
  5. public string Name { get; set; }
  6.  
  7. [Required(ErrorMessage = "{0} 必须填写")]
  8. [RegularExpression(@"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}", ErrorMessage = "邮件格式不正确")]
  9. public string Email { get; set; }
  10.  
  11. [Required(ErrorMessage = "{0} 必须填写")]
  12. [Range(, , ErrorMessage = "超出范围")]
  13. public int Age { get; set; }
  14.  
  15. [Required(ErrorMessage = "{0} 必须填写")]
  16. [StringLength(, MinimumLength = , ErrorMessage = "{0}输入长度不正确")]
  17. public string Phone { get; set; }
  18.  
  19. [Required(ErrorMessage = "{0} 必须填写")]
  20. [Range(typeof(decimal), "1000.00", "2000.99")]
  21. public decimal Salary { get; set; }
  22. }

然后实现一个ValidatetionHelper静态类,这里主要用到的是Validator.TryValidateObject方法。

  1. public static class ValidatetionHelper
  2. {
  3. public static ValidResult IsValid(object value)
  4. {
  5. ValidResult result = new ValidResult();
  6. try
  7. {
  8. var validationContext = new ValidationContext(value, null, null);
  9. var results = new List<ValidationResult>();
  10. var isValid = Validator.TryValidateObject(value, validationContext, results, true);
  11.  
  12. if (!isValid)
  13. {
  14. result.IsVaild = false;
  15. result.ErrorMembers = new List<ErrorMember>();
  16. foreach (var item in results)
  17. {
  18. result.ErrorMembers.Add(new ErrorMember()
  19. {
  20. ErrorMessage = item.ErrorMessage,
  21. ErrorMemberName = item.MemberNames.FirstOrDefault()
  22. });
  23. }
  24. }
  25. else
  26. {
  27. result.IsVaild = true;
  28. }
  29. }
  30. catch (Exception ex)
  31. {
  32. result.IsVaild = false;
  33. result.ErrorMembers = new List<ErrorMember>();
  34. result.ErrorMembers.Add(new ErrorMember()
  35. {
  36. ErrorMessage = ex.Message,
  37. ErrorMemberName = "Internal error"
  38. });
  39. }
  40.  
  41. return result;
  42. }
  43. }

其中需要的返回结果类

  1. public class ValidResult
  2. {
  3. public List<ErrorMember> ErrorMembers { get; set; }
  4. public bool IsVaild { get; set; }
  5. }
  6.  
  7. public class ErrorMember
  8. {
  9. public string ErrorMessage { get; set; }
  10. public string ErrorMemberName { get; set; }
  11. }

实现一个测试代码,这里看到对应验证数据比使用多个if简洁很多,整个代码也十分美观。

  1. static void Main(string[] args)
  2. {
  3. Person person = new Person();
  4. person.Name = "";
  5. person.Email = "121 212 K";
  6. person.Phone = "";
  7. person.Salary = ;
  8. var result = ValidatetionHelper.IsValid(person);
  9. if (!result.IsVaild)
  10. {
  11. foreach (ErrorMember errorMember in result.ErrorMembers)
  12. {
  13. Console.WriteLine(errorMember.ErrorMemberName + ":" + errorMember.ErrorMessage);
  14. }
  15. }
  16. Console.Read();
  17. }

通过测试,可以看到得到正确的验证结果。

后续有时间,把DisplayName给显示上去,那就更完美了。

参考:使用System.ComponentModel.DataAnnotations验证字段数据正确性

使用System.ComponentModel.DataAnnotations验证字段数据正确性的更多相关文章

  1. 对System.ComponentModel.DataAnnotations 的学习应用

    摘要 你还在为了验证一个Class对象中很多数据的有效性而写很多If条件判断吗?我也同样遇到这种问题,不过,最近学了一项新的方法,让我不在写很多if条件做判断,通过给属性标注特性来验证数据规则,从此再 ...

  2. System.ComponentModel.DataAnnotations 命名空间和RequiredAttribute 类

    System.ComponentModel.DataAnnotations 命名空间提供定义 ASP.NET MVC 和 ASP.NET 数据控件的类的特性. RequiredAttribute 指定 ...

  3. System.ComponentModel.DataAnnotations 冲突

    项目从原来的.NET Framework4.0 升级到 .NET Framework4.5 编译报错. 查找原因是: Entity Framework 与 .net4.5 的 System.Compo ...

  4. System.ComponentModel.DataAnnotations.Schema.TableAttribute 同时存在于EntityFramework.dll和System.ComponentModel.DataAnnotations.dll中

    Entity Framework 与 .net4.5 的 System.ComponentModel.DataAnnotations 都有 System.ComponentModel.DataAnno ...

  5. System.ComponentModel.DataAnnotations.Schema 冲突

    System.ComponentModel.DataAnnotations.Schema 冲突 Entity Framework 与 .net4.5 的 System.ComponentModel.D ...

  6. 解决EntityFramework与System.ComponentModel.DataAnnotations命名冲突

    比如,定义entity时指定一个外键, [ForeignKey("CustomerID")] public Customer Customer { get; set; } 编译时报 ...

  7. ASP.NET Core 6.0 基于模型验证的数据验证

    1 前言 在程序中,需要进行数据验证的场景经常存在,且数据验证是有必要的.前端进行数据验证,主要是为了减少服务器请求压力,和提高用户体验:后端进行数据验证,主要是为了保证数据的正确性,保证系统的健壮性 ...

  8. C# 特性 System.ComponentModel 命名空间属性方法大全,System.ComponentModel 命名空间的特性

    目录: System.ComponentModel 特性命名空间与常用类 System.ComponentModel.DataAnnotations ComponentModel - Classes ...

  9. “CreateRiaClientFilesTask”任务意外失败。 未能加载文件程序集“System.ComponentModel.DataAnnot...

    错误  77  “CreateRiaClientFilesTask”任务意外失败.  System.Web.HttpException (0x80004005): 未能加载文件或程序集“System. ...

随机推荐

  1. vue项目1-pizza点餐系统1-利用bootstrap4制作导航栏

    初次接触Bootstrap,简单谈一下理解.bootstrap是一个简单有强悍的前端框架,它是一个开源项目.当我们需要一些样式等,可以了解bootstrap的相关class.标签名称等所代表的意思,然 ...

  2. 可以提升幸福感的js小技巧(上)

    1. 类型强制转换 1.1 string强制转换为数字 可以用 *1来转化为数字(实际上是调用 .valueOf方法) 然后使用 Number.isNaN来判断是否为 NaN,或者使用 a!==a 来 ...

  3. k8s+docker+proget 镜像制作

    安装proget 1 首先在k8s上运行proget的数据库配置有个注意点:要根据proget官网要求的sql server排序方式建数据库,不然数据保存的时候会报错 2 proget运行起来后,默认 ...

  4. libpng Cximage图片处理

    跨平台 开源 png图片处理 https://www.cnblogs.com/lidabo/p/6923426.html Cximage BIPro

  5. Codeforces Round #593 (Div. 2) C. Labs A. Stones

    题目:https://codeforces.com/contest/1236/problem/A 思路:两种操作收益都是3 且都会消耗b 操作2对b消耗较小 则可优先选择操作2 再进行操作1 即可得到 ...

  6. dubbo SPI机制

    源码分析: /** * 获取扩展类 */ @SuppressWarnings("unchecked") public T getExtension(String name) { i ...

  7. Gym-100923H-Por Costel and the Match(带权并查集)

    链接: https://vjudge.net/problem/Gym-100923H 题意: Oberyn Martell and Gregor Clegane are dueling in a tr ...

  8. HDU-3605-Escape(最大流, 状态压缩)

    链接: https://vjudge.net/problem/HDU-3605 题意: 2012 If this is the end of the world how to do? I do not ...

  9. 【shell】文本按行逆序

    1.最简单的方法是使用tac [root ~]$ seq |tac 2.使用tr和awk. tr把换行符替换成自定义的分隔符,awk分解替换后的字符串,并逆序输出 [root ~]$ seq | tr ...

  10. shiro框架学习-8-shiro缓存

    1. shiro进行认证授权时会查询数据库获取用户角色权限信息,每次登录都会去查询,这样对性能会又影响.可以设置缓存,查询时先去缓存中查找,缓存中没有再去数据库查询. 从shiro的架构图中可以看到有 ...