使用一条消息验证多个属性

Validate multiple properties with one message

我正在尝试验证具有三个必需属性的 class。
如果其中一个或多个为空,它应该触发一条验证消息。
在流利的验证器中是否有一种惯用的方式来描述它?

我正在查看 dependant rules,但文档页面底部建议不要使用它们。
此外,我仍然想验证所有三个属性。我只是不想重复消息。
我注意到 RuleSets,但这些似乎有不同的用途。

或者,我可以专门为这三个选项创建一个没有消息的验证器,然后将新验证器链接到原始验证器中。那我想我可以给那个人一个消息。
但对于一个围绕可读性构建的系统来说,这是很多仪式。

因此寻找一种可读的方式来表达对三个字段的验证,结果是一条消息。

您可以通过 3 种主要方式使用 FluentValidation 执行此操作:条件、相关规则或自定义规则。

条件

您可以在 When 条件下使用 3 个单独的规则声明,以确保您只会收到一条验证消息。

RuleFor(x => x.Property1).NotNull()
  .WithMessage("At least one is required");

RuleFor(x => x.Property2).NotNull()
  .When(x => x.Property2 != null)
  .WithMessage("At least one is required");

RuleFor(x => x.Property3).NotNull()
  .When(x => x.Property1 != null && x.Property2 != null)
  .WithMessage("At least one is required");

依赖规则

RuleFor(x => x.Property1).NotNull()
  .WithMessage("At least one is required")
  .DependentRules(() => {
      RuleFor(x => x.Property2).NotNull()
       .WithMessage("At least one is required")
       .DependentRules(() => {
          RuleFor(x => x.Property3).NotNull().WithMessage("At least one is required");
       });
   });

我不是特别喜欢这种方法 - 我认为它很难阅读(因此文档中有警告),但如果您喜欢这种方法,它会很好用。

自定义逻辑

RuleFor(x => x)
  .Must(x => x.Property1 != null && x.Property2 != null && x.Property3 != null)
  .WithMessage("At least one is required");

这种方法略有不同,因为它创建了一个 model-level 规则,因此错误消息将与整个模型相关联,而不是与特定的 属性.

通过设置 CascadeMode 属性:

当第一条规则失败时停止验证器
public class MyClassValidator : AbstractValidator<MyClass>
{
    public DestinationDeviceValidator()
    {
        this.CascadeMode = CascadeMode.Stop;

        this.RuleFor(x => x.Property1)
            .NotNull();

        this.RuleFor(x => x.Property2)
            .NotNull();

        this.RuleFor(x => x.Property3)
            .NotNull();
    }
}