基于.NET的FluentValidation数据验证实现

FluentValidation 是一个基于 .NET 开发的验证框架,开源免费,而且优雅,支持链式操作,易于理解,功能完善,还是可与 MVC5、WebApi2 和 ASP.NET CORE 深度集成,组件内提供十几种常用验证器,可扩展性好,支持自定义验证器,支持本地化多语言。

要使用验证框架, 需要在项目中添加对 FluentValidation.dll 的引用,支持 netstandard2.0 库和 .NET4.5 平台,支持.NET Core 平台,最简单的方法是使用 NuGet 包管理器引用组件。我这里安装的是9.2.0版本。

Install-Package FluentValidation

若要在 ASP.NET Core 中使用 FluentValidation 扩展,可引用以下包:

Install-Package FluentValidation.AspNetCore

若要在 ASP.NET MVC 5 或 WebApi 2 项目集成, 可以使用分别使用 FluentValidation.Mvc5 和 FluentValidation.WebApi 程序包。

Install-Package FluentValidation.Mvc5 Install-Package FluentValidation.WebApi

创建第一个验证程序

若要为特定对象定义一组验证规则, 您需要创建一个从 AbstractValidator<T> 继承的类, 其中泛型T参数是要验证的类的类型。假设您有一个客户类别:

public class Customer { public int Id { get; set; } public string Surname { get; set; } public string Forename { get; set; } public decimal Discount { get; set; } public string Address { get; set; } }

接下来自定义继承于 AbstractValidator 泛型类的验证器,然后在构造函数中使用 LINQ 表达式编写 RuleFor 验证规则,使验证在。

using FluentValidation; using NetCoreBasicLearning.Entity; namespace NetCoreBasicLearning { public class CustomerValidator : AbstractValidator<Customer> { public CustomerValidator() { RuleFor(customer => customer.Surname).NotNull(); } } }

若要执行验证程序,我们通过定义好的 CustomerValidator 验证器传入实体类 Customer 即可。

该验证方法返回一个 ValidationResult 对象,表示验证结果,ValidationResult 包含两个属性:IsValid属性是布尔值, 它表示验证是否成功,Errors属性包含相关验证失败的详细信息。

public IActionResult Index(string id) {   Customer customer = new Customer();   CustomerValidator validationRules = new CustomerValidator();   ValidationResult validationResult = validationRules.Validate(customer);   if (!validationResult.IsValid)   {     var str = new StringBuilder();   foreach(var t in validationResult.Errors)     {       str.AppendLine($"属性:{t.PropertyName},错误信息:{t.ErrorMessage}");     }     return Content(str.ToString());   }   return View(); }

链接规则写法

您可以将对象的同一属性用多个验证程序链在一起,以下代码将验证 Surname 属性不为 Null 的同时且不等于foo字符串。

using FluentValidation; using NetCoreBasicLearning.Entity; namespace NetCoreBasicLearning { public class CustomerValidator : AbstractValidator<Customer> { public CustomerValidator() { RuleFor(customer => customer.Surname).NotNull().NotEqual("foo"); } } }

引发异常

如果验证失败, 不想返回 ValidationResult 对象,而是想直接抛出异常,可通过调用验证器的 ValidateAndThrow 进行验证。

如果验证失败,将引发一个 ValidationException 类型的异常,这个异常可以被上层程序捕获,并从异常中找到详细错误信息。

Customer customer = new Customer(); CustomerValidator validationRules = new CustomerValidator(); validationRules.ValidateAndThrow(customer);

集合

当针对一个集合进行验证时,只需要定义集合项类型的规则即可,以下规则将对集合中的每个元素运行 NotNull 检查。

public class Customer { public List<string> OtherAddress { get; set; } } public class CustomerValidator : AbstractValidator<Customer> {   public CustomerValidator()   {     RuleForEach(customer => customer.OtherAddress).NotEmpty();   } }

如果要对list进行进行非空判断可以如下:

public class CustomerValidator : AbstractValidator<Customer> {   public CustomerValidator()   {     RuleFor(customer => customer.OtherAddress).NotEmpty();   } }

复杂属性

验证程序可以用于复杂属性,假设您有两个类:客户和地址

public class Customer { public Adress Address { get; set; } } public class Adress { public string City { get; set; } public string Province { get; set; } }

然后定义一个基于地址的 AddressValidator 验证器件:

public class AdressValidator : AbstractValidator<Adress> { public AdressValidator() { RuleFor(t => t.City).NotEmpty(); RuleFor(t => t.Province).NotEmpty(); } }

然后定义一个基于客户的 CustomerValidator 验证器件,对地址验证时使用地址验证器。

public class CustomerValidator : AbstractValidator<Customer> { public CustomerValidator() { RuleFor(t => t.Address).SetValidator(new AdressValidator()); } }

如果不想要创建另一个验证器可以直接内联定义子规则:

RuleFor(t => t.Address.City).NotEmpty();

另外,还可以在集合属性上使用验证程序,假设客户对象包含地址集合属性:

public class Customer { public List<Adress> Address { get; set; } }

此验证程序可在 CustomerValidator 中通过 SetCollectionValidator(在8.0版本以前) 方法使用,在8.0版本以及之后被弃用需要使用RuleForEach来验证:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/d39ab55b6f956129eebb4104b5059fb9.html