You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FluentValidation升级11后首个验证失败即停止执行问题

问题根因

这是FluentValidation 11版本的破坏性变更导致的,和你的验证逻辑、单元测试写法无关:

  • 10及更早版本默认类级联模式是CascadeMode.Continue,会跑完所有配置的验证规则,收集全部失败结果再返回
  • 11版本开始默认类级联模式改成了CascadeMode.Stop,同层级规则只要碰到第一个验证失败项,就会直接终止后续所有规则执行,这就是你调整规则编写顺序、返回的错误项也跟着变的核心原因。
    你代码里已经把配置类级联模式的代码ClassLevelCascadeMode = CascadeMode.Continue;注释掉了,自然就用了11版本的默认Stop逻辑,不会返回全部错误。
修复方法

直接把你注释掉的类级联模式配置放开即可,显式指定需要执行完所有规则:

public sealed class Validator : AbstractValidator<Command>
{
    public Validator()
    {
        // 显式配置类级别级联模式为继续执行所有规则
        ClassLevelCascadeMode = CascadeMode.Continue;
        RuleFor(x => x.Id).ValidateId();
        RuleFor(x => x.Name).ValidateAccountName();
        RuleFor(x => x.Description).ValidateAccountDescription();
        RuleFor(x => x.Status).ValidateAccountStatus();
        When(
            x => !(x.prop1 is null) || !(x.prop2 is null) || !(x.prop3 is null),
            () =>
            {
                RuleFor(x => x.prop1Enum).NotNull().IsInEnum();
                RuleFor(x => x.prop2Number).ValidateNumber();
                RuleFor(x => x.prop3Number).ValidateNumber(); 
            }
        );
    }
}
额外注意事项

如果改完配置还有规则不执行,逐一排查下面几个点:

  • 检查你自定义的ValidateId、ValidateAccountName、ValidateNumber这类扩展验证方法内部,有没有单独给对应规则配置CascadeMode.Stop,规则级别的级联配置优先级高于类级别配置
  • 检查项目启动时的FluentValidation全局配置,有没有在依赖注入注册时写过全局默认级联模式为Stop的代码,验证器内部的显式配置会覆盖全局配置,但如果没写验证器内的配置就会受全局配置影响
  • 你贴的示例代码里有几处笔误,比如x.prop1is null少了空格、x.prop 3 is null多了空格、excludeprop3大小写不对,实际编译运行前要修正,不然会直接报编译错误。

另外你单元测试里的断言result.Errors.Should().HaveCountLessOrEqualTo(3);逻辑和预期不符,你要验证的是缺几个字段返回几个对应错误,应该断言错误数等于当前测试用例排除的字段数量,而不是小于等于3,不过这个问题不会导致你现在碰到的只返回第一个错误的现象。

内容的提问来源于stack exchange,提问作者JesseNicholsonStorable

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 19:06:34