У вас есть две возможности для этого в одной команде, но они немного сложны, так как вам необходимо проверить внутреннее свойство, проверяя, что класс включения не равен нулю. Оба они вращаются вокруг 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);
}
}