【问题标题】:Multiple validation in one rule using FluentValidation使用 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

标签: c# .net-core fluentvalidation


【解决方案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的代码应该可以工作。但事实并非如此。
  • 您可以全局设置默认行为,可能在他的项目中设置为停止。但你是对的,我编辑了答案。
  • 我理解是级联模式控制验证失败时的执行,对吧?但是......使用我的代码的第二部分,当第一个验证成功时,它不会执行其他两个验证。
猜你喜欢
  • 2021-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多