2013-10-07 5 views
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); 
    } 
} 

Этот валидатор проверяет, что если ExistingCustomer ложно, то CompetitorProducts не равно нулю и имеет, по меньшей мере, один элемент.Условно проверки Collection

Это работает, но можно ли это написать как одно правило?

ответ

4

У вас есть две возможности для этого в одной команде, но они немного сложны, так как вам необходимо проверить внутреннее свойство, проверяя, что класс включения не равен нулю. Оба они вращаются вокруг Cascade property (см. «Настройка каскадного режима»), чтобы остановить проверку при первой ошибке.

Во-первых, вы можете использовать Must для проверки. Вам нужно будет указать WithMessage, как я сделал, чтобы избежать получения общего «Указанное условие не было выполнено для« продуктов конкурентов ». ошибка. Вы также можете переопределить 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); 
     } 
    } 
Смежные вопросы