使用不带类型的FluentValidation手动验证 [英] Manually validate with FluentValidation without type
本文介绍了使用不带类型的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屋!
查看全文