【问题标题】:Validate multiple properties with one message使用一条消息验证多个属性
【发布时间】:2022-05-08 01:18:00
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: fluentvalidation


    【解决方案1】:

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

    条件

    您可以使用 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");
    

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

    【讨论】:

      【解决方案2】:

      通过设置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();
          }
      }
      

      【讨论】:

      • 是的,假设只有这三个属性,这也是一个不错的选择
      猜你喜欢
      • 2014-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-11
      • 1970-01-01
      • 1970-01-01
      • 2011-09-21
      相关资源
      最近更新 更多