導入Excel時需要對字段進行各種邏輯校驗,校驗過程中會有很多重復,冗余且不靈活,於是想到使用模型校驗(DataAnnotations)來優化
(一)簡單示例
使用DataAnnotations程序集中的注解特性可進行模型驗證,微軟已提供許多默認規則,如Required,
MinLength,MaxLength等
參考地址:
https://docs.microsoft.com/zh-cn/dotnet/api/system.componentmodel.dataannotations?view=netcore-3.1
以下,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深度集成實現客戶端和服務器端驗證,
以上,僅用於學習和總結
參考鏈接:
