使用 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 库

验证规则构建神器 FluentValidation.md

在 .NET 中使用 FluentValidation 进行参数验证

C#封装FluentValidation,用了之后通篇还是AbstractValidator,真的看不下去了

为啥我在 FluentValidation MustAsync 中收到 CS1061 错误

FluentValidation 和服务器+客户端远程验证器