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

问题描述 投票:0回答:2

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

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

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

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

fluentvalidation
2个回答
5
投票

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

条件

您可以使用 3 个带有

When
条件的单独规则声明来确保您只会收到一条验证消息。

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

RuleFor(x => x.Property2).NotNull()
  .When(x => x.Property1 != 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");

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


1
投票

通过设置

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();
    }
}
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.