使用没有类型的 FluentValidation 手动验证

Manually validate with FluentValidation without type

我正在尝试手动验证具有 属性 (Questions) 的模型 (PageModel),它是多态类型的 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 在工厂中找到正确的验证器,然后调用它。

有人知道怎么做吗?

因此,由于 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}]");
}