.Net Core 数据校验Attribute和FluentValidate
导入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深度集成实现客户端和服务器端验证,
以上,仅用于学习和总结
参考链接:
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步