使用不带类型的FluentValidation手动验证 [英] Manually validate with FluentValidation without type

查看:0
本文介绍了使用不带类型的FluentValidation手动验证的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试手动验证一个模型(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}]");
}

这篇关于使用不带类型的FluentValidation手动验证的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆