4
public class ProspectValidator : AbstractValidator<Prospect>
{
    public ProspectValidator()
    {   
        RuleFor(p => p.CompetitorProducts)
            .NotNull()
            .When(p => !p.ExistingCustomer);

        RuleFor(p => p.CompetitorProducts.Count)
            .GreaterThan(0)
            .When(p => p.CompetitorProducts != null && !p.ExistingCustomer);
    }
}

此验证器检查 ifExistingCustomer为 false thenCompetitorProducts不为 null 并且至少有一个元素。

它有效,但是可以将其写为一条规则吗?

4

1 回答 1

7

您有两个选项可以在单个命令中执行此操作,但它们都有点棘手,因为您需要在验证包含类不为空的同时验证内部属性。它们都围绕Cascade属性(请参阅“设置级联模式”)以停止对第一个错误的验证。

首先,您可以使用Must来进行验证。您需要WithMessage像我所做的那样指定 a 以避免获得通用的“'竞争对手产品'的指定条件不满足。” 错误。您可能还想覆盖WithErrorCode默认为Predicate. 请注意,这只会显示在第二个验证错误上;第一个错误仍将正确返回属性不能为空的消息。

RuleFor(p => p.CompetitorProducts)
  .Cascade(CascadeMode.StopOnFirstFailure)
  .NotNull()
  .Must(p => p.Count > 0)
  .WithMessage("{PropertyName} must be greater than '0'")
  .When(p => !p.ExistingCustomer);

其次,您可以为CompetitorProducts整个类提供一个验证器。这将允许您让 FluentValidation 管理错误消息和代码。如果您必须在类上进行其他验证,这将很有效,但如果您只需要验证单个属性,则可能会过大。

  public class ProspectValidator: AbstractValidator<Prospect>
    {
        public CurrentUserValidator()
        {
            RuleFor(p => p.CompetitorProducts)
              .Cascade(CascadeMode.StopOnFirstFailure)
              .NotNull()
              .SetValidator(new CompetitorProductsValidator())
              .When(p => !p.ExistingCustomer);
        }
    }

    public class CompetitorProductsValidator : AbstractValidator<Prospect.CompetitorProducts>
    {
        public CompetitorProductsValidator()
        {
            RuleFor(p => p.Count)
              .GreaterThan(0);
        }
    }
于 2013-11-15T22:14:35.320 回答