设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 创业者 数据 手机
当前位置: 首页 > 站长学院 > Asp教程 > 正文

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

发布时间:2020-11-22 15:29 所属栏目:120 来源:网络整理
导读:public class CustomerValidator : AbstractValidatorCustomer{public CustomerValidator() {RuleForEach(t = t.Address).SetValidator(new AdressValidator());//RuleFor(x = x.Address).SetCollectionValidator(n

public class CustomerValidator : AbstractValidator<Customer> { public CustomerValidator() { RuleForEach(t => t.Address).SetValidator(new AdressValidator()); //RuleFor(x => x.Address).SetCollectionValidator(new AdressValidator());在8.0版本及以后弃用 } }

在编写验证规则时,可以通过 Where 关键字排除或者筛选不需要验证的对象。

public class CustomerValidator : AbstractValidator<Customer> { public CustomerValidator() { RuleForEach(t => t.Address).Where(t => !string.IsNullOrEmpty(t.City)).SetValidator(new AdressValidator()); //RuleFor(x => x.Address).SetCollectionValidator(new AdressValidator()).Where(t => !string.IsNullOrEmpty(t.City));在8.0版本及以后弃用 } }

从FluentValidation 8.5开始,您还可以使用以下ChildRules方法在线定义子集合元素的规则,从而不用再定义另一个验证器:

RuleForEach(t => t.Address).ChildRules(adderss => { adderss.RuleFor(t => t.City).NotEmpty(); adderss.RuleFor(t => t.Province).NotEmpty(); }).NotEmpty();

支持规则集

规则集允许您将验证规则分组在一起,这些规则可以作为一个组一起执行,而忽略其他规则:

我们可以把“姓”和“名”统一加在一个姓名规则集中。

public class CustomerValidator : AbstractValidator<Customer> { public CustomerValidator() { RuleSet("Name", () => { RuleFor(t => t.Surname).NotEmpty(); RuleFor(t => t.Forename).NotEmpty(); }); } }

规则集通过一般的 Validate 方法是不会执行验证的,需要用如下方法进行单独的验证,这将复杂的验证器定义分解为较小的部分进行验证,IncludeRuleSets 中可以传入多个规则集名称来执行多个规则集的验证:

Customer customer = new Customer(); CustomerValidator validationRules = new CustomerValidator(); ValidationResult validationResult = validationRules.Validate(customer, options => options.IncludeRuleSets("Name"));

还可以通过 IncludeRulesNotInRuleSet 方法或使用特殊名称“默认”(不区分大小写)来执行验证所有不属于规则集的规则:

ValidationResult validationResult = validationRules.Validate(customer, options =>{ options.IncludeRulesNotInRuleSet(); options.IncludeRuleSets("Name"); } );

可以通过调用强制执行所有规则,而不管它们是否在规则集中 IncludeAllRuleSets(这等效于using IncludeRuleSets("*"))。

同个类型的多个验证器

一个验证器可以包含多个其他的验证器,只要这些验证器都是验证统一类型的即可。这样就可以拆分验证器,通过不同的需求组合在一起:

public class CustomerValidator : AbstractValidator<Customer> { public CustomerValidator() { Include(new CustomerSurnameValidator()); Include(new CustomerForenameValidator()); } } public class CustomerSurnameValidator : AbstractValidator<Customer> { public CustomerSurnameValidator() { RuleFor(t => t.Surname).NotEmpty(); } } public class CustomerForenameValidator : AbstractValidator<Customer> { public CustomerForenameValidator() { RuleFor(t => t.Forename).NotEmpty(); } }

继承验证

从FluentValidation 9.2开始,如果您的对象属性作为其他类的基类或接口,则可以为各个子类/实现器设置特定的子验证器,来验证这个属性。我们的类设置如下:

public class Store { public People Peoples { get; set; } } public class Customer : People { public string Address { get; set; } } public class People { public string Name { get; set; } }

验证器如下:

public class StoreValidator : AbstractValidator<Store> { public StoreValidator() { RuleFor(t => t.Peoples).NotNull().SetInheritanceValidator(t => { t.Add<Customer>(new CustomerValidator()); }); } } public class CustomerValidator : AbstractValidator<Customer> { public CustomerValidator() { RuleFor(t => t.Address).NotEmpty(); } }

覆盖消息

通过在验证程序上调用 WithMessage 方法, 可以覆盖验证程序的默认验证错误消息。错误提示中,可以通过 {PropertyName} 占位符替换属性名。除了 {PropertyName} 占位符,框架还内置了:{PropertyValue}、{ComparisonValue}、{MinLength}、{MaxLength}和{TotalLength} 占位符,关于更多内置占位符,可以参阅官方文档。

RuleFor(customer => customer.Surname).NotNull().WithMessage("Please ensure you have entered your {PropertyName}");

验证程序支持通过 WithName 方法来指定属性别名,以下代码输出姓名不能为空。请注意,这仅替换错误消息中属性的名称。当您检查上的Errors集合时ValidationResult,此错误仍将与一个名为的属性相关联Surname。如果要完全重命名该属性,则可以使用OverridePropertyName方法。

RuleFor(customer => customer.Surname).NotNull().WithName("姓名");

条件

When 和 Unless方法可用于执行满足指定条件情况下的规则,例如只当Surname属性不为空的时候,才执行前面的Name属性的非空验证(Unless和When是相反的所以这边只讲When就行啦!):

RuleFor(t => t.Name).NotEmpty().When(t => !string.IsNullOrEmpty(t.Surname));

如果需要指定多个规则在相同的条件下才执行验证,可以直接用顶级的When方法:

(编辑:ASP站长网)

网友评论
推荐文章
    热点阅读