基于.NET的FluentValidation数据验证实现
public class CustomerValidator : AbstractValidator<Customer> { public CustomerValidator() { When(t => !string.IsNullOrEmpty(t.Surname), () => { RuleFor(t => t.Name).NotEmpty();//其他验证规则 }); } } 通过在When方法后面追加一个Otherwise方法,可以执行不满足When中调整的验证规则,如下: When(t => !string.IsNullOrEmpty(t.Surname), () => { RuleFor(t => t.Name).NotEmpty(); }).Otherwise(() => { RuleFor(t => t.Name).Equal("哈哈"); }); 默认情况下,FluentValidation会将条件应用于对的同一调用中的所有先前的验证器RuleFor。比如下面这条代码,如果Surname不为空,则对Name进行非空和是否等于11的验证,否则不会对Name执行这两个验证: RuleFor(t => t.Name).NotEmpty().Equal("11").When(t => !string.IsNullOrEmpty(t.Surname)); 如果仅希望将条件应用于紧接条件之前的验证器,则必须明确参数ApplyConditionTo.CurrentValidator,如下,只有Equal受到When方法的限制,NotEmpty不管When是否为true都会执行的。 RuleFor(t => t.Name).NotEmpty().Equal("11").When(t => !string.IsNullOrEmpty(t.Surname), ApplyConditionTo.CurrentValidator); 设置级联模式 有两种联级模式: Continue (默认设置)-始终调用规则定义中的所有验证器 Stop -验证程序失败后立即停止执行规则(仅在FluentValidation 9.1和更高版本中可用,在旧版本中,您可以改用StopOnFirstFailure) 通过如下代码,可以在NotNull验证不通过的时候就停止验证,不再执行NotEqual的验证。默认是验证不通过,也继续验证下去。 RuleFor(x => x.Surname).Cascade(CascadeMode.Stop).NotNull().NotEqual("foo"); 设置严重性级别 默认情况下,如果这些规则失败,则严重性为“错误”。可以通过调用WithSeverity方法来更改。例如,如果我们希望将缺少的姓氏标识为警告而不是错误,则可以将上面的行修改为: RuleFor(x => x.Surname).NotNull().WithSeverity(Severity.Warning); 在9.0及更高版本中,可以改用回调,这也使您可以访问正在验证的项目: RuleFor(person => person.Surname).NotNull().WithSeverity(person => Severity.Warning); 定制验证器 之前我们都是使用内置的验证器,如Equal、NotNull等等。 我们也可以自己定义验证器,实现自定义验证器的最简单方法是使用Must方法,该方法在内部使用PredicateValidator。假设我们有以下课程: public class Person { public IList<Pet> Pets {get;set;} = new List<Pet>(); } 为了确保我们的list属性包含少于10个项目,我们可以这样做: public class PersonValidator : AbstractValidator<Person> { public PersonValidator() { RuleFor(x => x.Pets).Must(list => list.Count < 10) .WithMessage("The list must contain fewer than 10 items"); } } 为了使我们自己定义的验证器可以重用,我们可以将其包装为可作用于任何List<T>类型的扩展方法。 public static class MyCustomValidators { public static IRuleBuilderOptions<T, IList<TElement>> ListMustContainFewerThan<T, TElement>(this IRuleBuilder<T, IList<TElement>> ruleBuilder, int num) { return ruleBuilder.Must(list => list.Count < num).WithMessage("The list contains too many items"); } } 在这里,我们在上创建一个扩展方法IRuleBuilder<T,TProperty>,并使用通用类型约束来确保此方法仅出现在对列表类型的智能感知中。在方法内部,我们以与以前相同的方式调用Must方法,但是这次我们在传入的RuleBuilder实例上调用它。我们还将要比较的项目数作为参数传递。现在,我们的规则定义可以重写为使用以下方法: RuleFor(x => x.Pets).ListMustContainFewerThan(10); 我们还可以通过Custom方法来自定义验证器,它相比于Must的好处是允许针对同一规则返回多个错误(通过context.AddFailure多次调用该方法)。 public class PersonValidator : AbstractValidator<Person> { public PersonValidator() { RuleFor(x => x.Pets).Custom((list, context) => { if(list.Count > 10) { context.AddFailure("The list must contain 10 items or fewer"); } }); } } 到此这篇关于基于.NET的FluentValidation数据验证实现的文章就介绍到这了,更多相关.NET FluentValidation数据验证内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! (编辑:焦作站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |