一条消息验证多个属性

时间:2020-08-14 09:22:23

标签: fluentvalidation

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

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

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

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

1 个答案:

答案 0 :(得分:1)

使用FluentValidation可以通过以下三种主要方法:条件,相关规则或自定义规则。

条件

您可以将3个单独的规则声明与When条件一起使用,以确保仅收到一条验证消息。

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");

此方法在创建模型级规则时会稍有不同,因此错误消息将与整个模型关联,而不是与特定属性关联。