使用不带类型的FluentValidation手动验证不带、类型、FluentValidation

2023-09-05 23:01:55 作者:不薈彈琹的詩仒

我正在尝试手动验证一个模型(PageModel),该模型的属性(Questions)是多态类型的IEumable。我无法使其自动工作,因此我正在尝试使用下面的代码。

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通过工厂找到正确的验证器,然后调用它。

有人知道怎么做吗?

推荐答案

所以我知道如何做到这一点,因为验证上下文所需的类型对工作并不重要,所以我只使用了一个对象。在将错误添加到模型状态时,我还需要使用正确的前缀(在我的例子中),以便它们映射到正确的模型属性(这就是我使用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}]");
}