.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深度集成實現客戶端和服務器端驗證,
 
以上,僅用於學習和總結
 
參考鏈接:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM