使用FluentValidation验证互斥字段

dal*_*oss 4 c# fluentvalidation

我试图使用FluentValidation验证三个字段中只有一个具有值.

RuleFor(x => x.Date1)
            .Must(x => !x.HasValue)
            .When(x => x.Date2.HasValue || x.Date3.HasValue)
            .WithMessage("Select only one of Date 1, Date 2 and Date 3");
Run Code Online (Sandbox Code Playgroud)

其他2个日期重复此操作.正如所料,这会产生匹配的每条规则的消息.

还有其他规则,所以有没有办法执行其他规则,但在这三个中的第一个失败?我已经看到我可以在全球范围内设置CascadeMode.StopOnFirstFailure,但我希望这三个规则之外的其他规则能够像现在这样工作.

dal*_*oss 5

我决定沿着另一条路走下去.它感觉很优雅,但我知道它是否通过了代码审查.

我创建了一个新属性

    public IEnumerable<DateTime?> MutuallyExclusiveDates
    {
        get
        {
            return new List<DateTime?>()
            {
                Date1,
                Date2,
                Date3
            };

        }
    }
Run Code Online (Sandbox Code Playgroud)

然后我添加了这个规则

 RuleFor(x => x.MutuallyExclusiveDates)
            .Must(x => x.Count(d => d.HasValue) <= 1)
            .WithMessage("Select only one of Date 1, Date 2 and Date 3");
Run Code Online (Sandbox Code Playgroud)