Вручную проверить с помощью FluentValidation без типа

Я пытаюсь вручную проверить модель (PageModel), которая имеет свойство (Questions), которое является IEnumerable полиморфных типов. Я не мог заставить это работать автоматически, поэтому я пытаюсь использовать код ниже.

public IActionResult Submit([FromServices] IValidatorFactory factory, [FromForm] PageModel model)
{
    foreach ( var question in model.Questions )
    {
        Type questionType = question.GetType();
        var validator = factory.GetValidator(question.GetType());
        var results = validator.Validate(ValidationContext.CreateWithOptions(question));
        results.AddToModelState(ModelState, null);
    }

Однако IValidator.Validate() не использует модель (question), а вместо этого нуждается в ValidationContext<T> или IValidationContext, ни один из которых я не могу создать, не зная типа валидатора во время компиляции.

Пример ручной проверки в документах показывает, что создается конкретный валидатор, но я бы хотел, чтобы FluentValidation нашла правильный с фабрикой, а затем вызвала его.

Кто-нибудь знает как это сделать?


person Luke Briner    schedule 27.11.2020    source источник


Ответы (1)


Итак, я понял, как это сделать, учитывая тот факт, что тип, необходимый для ValidationContext, не важен для работы, поэтому я просто использую объект. Мне также нужно использовать правильный префикс (в моем случае) при добавлении ошибок в состояние модели, чтобы они отображались на правильные свойства модели (именно поэтому я использую цикл for вместо foreach).

for ( var i = 0; i < model.Questions.Count(); ++i )
{
    var question = model.Questions[i];
    Type questionType = question.GetType();
    var validator = factory.GetValidator(questionType);
    var results = validator.Validate(new ValidationContext<object>(question));
    results.AddToModelState(ModelState, $"Questions[{i}]");
}
person Luke Briner    schedule 27.11.2020