FluentValidation, когда AbstractValidator является массивом

#c# #asp.net #fluentvalidation

#c# #asp.net #fluentvalidation

Вопрос:

Хотите выполнить проверку самого массива, а также элементов в массиве. Мы не можем обернуть массив в другой класс. Проблема в том, что я, похоже, не могу заставить это проверять по элементам в самом массиве.

 public class MyItemArrayValidator : AbstractValidator<MyItem[]>
{
    RuleFor(list => list)
        .Must(list => list.Length <= 25)
        .WithMessage("Too many items in array"));

    //Line that does not work below
    RuleFor(list => list).SetCollectionValidator(new MyItemValidator());
}

public class MyItemValidator : AbstractValidator<MyItem>
{
    ... validate MyItem stuff
}
 

Обновить
Ошибка, возвращаемая при вызове строки…

 RuleFor(list => list).SetCollectionValidator(new MyItemValidator());
 

is «Вложенные валидаторы могут использоваться только с выражениями-членами».

Я понимаю, что ошибка связана с тем, что я работаю с объектом, а не с членом, так что, возможно, такой подход неверен.

Комментарии:

1. Вы имели в виду .Must(список => список. Длина> 25) ? (больше, чем вместо меньше, чем )

2. @FeryalBadili нет, список не может быть больше 25, это правило работает так, как ожидалось. Проблема, однако, заключается в элементах массивов. Я просто хотел продемонстрировать, что я хотел работать как с самим массивом, так и с его элементами.

Ответ №1:

Я нашел это в документации, используя

Правило для каждого

setValidator

 public class CustomerValidator : AbstractValidator<Customer> {
  public CustomerValidator() {
    RuleForEach(x => x.Orders).SetValidator(new OrderValidator());
  }
}

public class OrderValidator : AbstractValidator<Order> {
  public OrderValidator() {
    RuleFor(x => x.Total).GreaterThan(0);
  }
}
 

FluentValidationDocumentation-ссылка