使用没有类型的 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}]");
}
我正在尝试手动验证具有 属性 (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}]");
}