.Net Core 数据校验Attribute和FluentValidate

导入Excel时需要对字段进行各种逻辑校验,校验过程中会有很多重复,冗余且不灵活,于是想到使用模型校验(DataAnnotations)来优化
 
(一)简单示例
使用DataAnnotations程序集中的注解特性可进行模型验证,微软已提供许多默认规则,如Required,
MinLength,MaxLength等
 
以下,MaxLength为例,校验字符串长度
1 public class Blog
2     {
3         public int BlogId { get; set; }
4         [MaxLength(3)]
5         public string Name { get; set; }
6         public string Url { get; set; }
7         public List<Post> Posts { get; set; }
8     }
 1 static void Main(string[] args)
 2 {
 3             Blog blog = new Blog { Name="This is Name"};
 4             var validateContext = new ValidationContext(blog);
 5             var validateResults = new List<ValidationResult>();
 6             if (!Validator.TryValidateObject(blog, validateContext, validateResults, true))
 7             {
 8                 validateResults.ForEach(vr => Console.WriteLine(vr.ErrorMessage));
 9             }
10             Console.ReadKey();
11 }
12  
结果如下:
 
(2)自定义校验 (Custom Validation Attribute)
默认校验规则有限,无法满足特定的操作,需要我们可以自定义进行校验
 
Attribute都是继承自类ValidationAttribute,我们新建一个自定义校验来继承此类:
新建类“StringContainsAttribute
 1 public class StringContainsAttribute: ValidationAttribute
 2     {
 3         public string ContainsSubString { get; }
 4  
 5         public StringContainsAttribute(string containsSubString)
 6         {
 7             ContainsSubString = containsSubString;
 8         }
 9  
10         public override bool IsValid(object value)
11         {
12             string valueString = value.ToString();
13             if (string.IsNullOrWhiteSpace(ContainsSubString))
14             {
15                 throw new InvalidOperationException("Substring cannot be null or empty.");
16             }
17  
18             if (ContainsSubString.Length > valueString.Length)
19             {
20                 throw new InvalidOperationException("Invalid length of the substring.");
21             }
22  
23  
24             return valueString.Contains(ContainsSubString);
25         }
26  
27     }
 
在Blog类中新增校验特性 StringContains
 
结果如下:
 
(3)通用验证方法
通过重写Saving Changes实现在EF Core中的通用验证,提高性能
1 try
2 {
3   _context.Add(new Blog { Name = "This is TestName" });
4   _context.SaveChanges();
5 }
6 catch (ValidationException e)
7 {
8    e.Errors.ToList().ForEach(er => Console.WriteLine(er.ErrorMessage));
9 }
 1  public override int SaveChanges()
 2    {
 3             var entities = ChangeTracker.Entries().Where(e => e.State == EntityState.Added || e.State == EntityState.Modified).Select(s => s.Entity);
 4             foreach (var entity in entities)
 5             {
 6                 var validationConetxt = new ValidationContext(entity);
 7                 Validator.ValidateObject(entity, validationConetxt, true);
 8             }
 9             return base.SaveChanges();
10    }
 
(4)引入第三方FluentValidation验证框架
一个轻量级第三方验证库,使用Fluent形式的Lamada表达式来构建验证规则,可与.Net Core深度集成实现客户端和服务器端验证,
 
以上,仅用于学习和总结
 
参考链接:
posted @ 2020-09-26 22:35  y_w_k  阅读(1354)  评论(0编辑  收藏  举报