MaximumLength为最大长度验证器,MinimumLength为最小长度验证器,而Length则是二者的结合,需要注意的是,这三种验证器仅对字符串有效,且不会验证null,当值为null时,则不对长度进行验证,所以使用长度验证器时,建议结合NotNull一起使用。
LessThan、LessThanOrEqualTo、GreaterThan、GreaterThanOrEqualTo上述的几个验证器为比较验证器,仅适用于继承IComparable接口的属性,分别表示的是:小于、小于或等于、大于、大于或等于。
Matches正则表达式验证器,用于确保指定的属性与给定的正则表达式匹配。
ExclusiveBetween和InclusiveBetween示例代码如下:
RuleFor(x => x.Id).ExclusiveBetween(1,10); RuleFor(x => x.Id).InclusiveBetween(1,10);以上代码均表示输入的Id的值需要在1,10之间,而两者的区别是,InclusiveBetween验证器是包含头和尾的,而ExclusiveBetween是不包含的,例如当Id值为1时,ExclusiveBetween验证失败,但InclusiveBetween则验证成功。
覆盖验证器默认的错误提示在文章的开头提到了,当验证Student的Age属性不通过时,提示信息是:'Age' 必须在 10 (包含)和 25 (包含)之间, 您输入了 0。
这个提示信息对于开发者来讲,定位问题已经很清晰了,但如果要在WebApi中讲验证的错误信息返回给前端,那么这个提示就会被用户看到,则此错误信息就不太友好,FluentValidation提供了多种覆盖错误提示的方式,下面就来一起看下。
占位符我们可以将验证Age的代码改为如下所示:
RuleFor(x => x.Age).InclusiveBetween(10, 25).WithMessage("年龄必须在{From}到{To}之间");当验证不通过时,输出的错误信息则为:年龄必须在10到25之间。
程序自动将{From}和{To}进行了替换。每个验证器的占位符都不一样,有关占位符的完整列表,请查看官方文档 https://docs.fluentvalidation.net/en/latest/built-in-validators.html。
覆盖属性名称此方法是将属性的名称使用指定的字符串替换,如下所示:
RuleFor(x => x.Age).InclusiveBetween(10, 25).WithName("年龄");当发生错误时,会自动将系统默认的错误提示信息中的"Age"替换为"年龄"
默认情况下,When或者Otherwise将应用于链式调用的所有前置的验证器,如果只希望条件引用于前面的第一个验证器,则必须使用ApplyConditionTo.CurrentValidator显示指定
RuleFor(x => x.Age).GreaterThan(10).LessThan(20).When(x => x.Sex == 2,ApplyConditionTo.CurrentValidator);上述的代码,如果不加ApplyConditionTo.CurrentValidator,则当Sex等于2时,则要求Age大于10且小于20。而Sex不等于2时,则不作任何验证。如果加上ApplyConditionTo.CurrentValidator,则Age大于10的验证跟Sex的值没有任何关系了,程序会始终验证Age是否大于10
带条件的验证规则使用When方法可控制规则执行的条件。例如,国家的法定结婚年龄为女性20岁,则验证年龄属性时,只有当性别为女时,才对年龄大于等于20进行校验。
RuleFor(x => x.Age).GreaterThan(20).When(x => x.Sex == 2);相反的,Unless表示的是当指定条件不满足时,才执行校验。
RuleFor(x => x.Age).GreaterThan(20).Unless(x => x.Sex == 2);上述代码表示当Sex值不为2时,校验Age是否大于等于20
如果需要为多个验证规则指定相同的条件,可以调用When的顶级方法,而不是在规则末尾调用When方法。
When(x => x.Sex == 2, () => { RuleFor(x => x.Name).Must(x => !x.EndsWith("国庆")); RuleFor(x => x.Age).LessThan(30); });上述代码表示是,当Sex等于2时,Age需要小于30,并且名字不能以"国庆"结尾。
将Otherwise方法链接到When调用,表示When条件不满足时,执行的验证规则。
When(x => x.Sex == 2, () => { RuleFor(x => x.Name).Must(x => x.EndsWith("国庆")); RuleFor(x => x.Age).LessThan(30); }).Otherwise(() => { RuleFor(x => x.Age).LessThan(50); });上述代码中的Otherwise方法表示的是,当Sex不等于2时,则Age需要小于50
链式调用当一个属性使用多个验证规则时,可将多个验证器链接在一起,比如,Student类的Name属性不能为空,并且,长度需要小于10,则对应的代码为:
public StudentValidator() { RuleFor(x =>x.Name).NotEmpty().MaximumLength(10); } CascadeModeCascadeMode是一个枚举类型的属性,有两个选项:Continue和Stop
如果设置为Stop,则检测到失败的验证,则立即终止,不会继续执行剩余属性的验证。默认值为Continue
CascadeMode = CascadeMode.Stop; RuleFor(x => x.Name).NotEmpty().MaximumLength(10); RuleFor(x => x.NickName).NotEmpty().MaximumLength(10);如上述代码所示,当Name值不满足要求时,则会停止对NickName的校验
依赖规则默认情况下,FluentValidation 中的所有规则都是独立的,不能彼此影响。这是异步验证工作所必需的,也是必要的。但是,在某些情况下,您可能希望确保某些规则仅在另一个规则完成之后执行。您可以使用DependentRules它来做到这一点。