使用 FluentValidation 在一条规则中进行多重验证
Posted
技术标签:
【中文标题】使用 FluentValidation 在一条规则中进行多重验证【英文标题】:Multiple validation in one rule using FluentValidation 【发布时间】:2021-12-16 21:23:29 【问题描述】:我正在尝试使用 FluentValidation 库构建验证规则。
当我使用下面代码的第一部分时,它按预期工作;但是当我使用第二部分时,只执行第一个验证,忽略最后两个验证规则。
第二部分不应该工作吗?我做错了吗?
// first part -- it works
RuleFor(c => c.Field).RequiredField().WithMessage(CustomMsg1);
RuleFor(c => c.Field).ValidateField().WithMessage(CustomMsg2);
RuleFor(c => c.Field).IsNumeric().WithMessage(CustomMsg3);
// second part -- validates only the first rule
RuleFor(c => c.Field)
.RequiredField().WithMessage(CustomMsg1)
.ValidateField().WithMessage(CustomMsg2)
.IsNumeric().WithMessage(CustomMsg3);
【问题讨论】:
FluentValidation 版本:9.5.3 【参考方案1】:您可以使用 CascadeMode 枚举指定 FluentValidator 的级联行为。
您可以阅读更多关于它的信息here。
默认行为应该是您需要的行为,但如果在不设置 CascadeMode 的情况下它的工作方式不同,则默认值可能是在您项目的某个地方全局设置的。
全局配置默认值如下所示:
ValidatorOptions.Global.CascadeMode = CascadeMode.Stop;
上面设置了默认值的代码应该如下所示:
RuleFor(c => c.Field)
.Cascade(CascadeMode.Continue)
.RequiredField().WithMessage(CustomMsg1)
.ValidateField().WithMessage(CustomMsg2)
.IsNumeric().WithMessage(CustomMsg3);
【讨论】:
您应该提到CascadeMode.Continue
是默认值。所以你可以省略它......即OP的代码应该可以工作。但事实并非如此。
您可以全局设置默认行为,可能在他的项目中设置为停止。但你是对的,我编辑了答案。
我理解是级联模式控制验证失败时的执行,对吧?但是......使用我的代码的第二部分,当第一个验证成功时,它不会执行其他两个验证。以上是关于使用 FluentValidation 在一条规则中进行多重验证的主要内容,如果未能解决你的问题,请参考以下文章
FluentValidation:一个非常受欢迎的,用于构建强类型验证规则的.NET 库
在 .NET 中使用 FluentValidation 进行参数验证
C#封装FluentValidation,用了之后通篇还是AbstractValidator,真的看不下去了