【问题标题】:Manually validate with FluentValidation without type使用 FluentValidation 手动验证无类型
【发布时间】:2020-11-27 14:59:47
【问题描述】:

我正在尝试手动验证具有属性 (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 能够在工厂中找到正确的验证器,然后调用它。

有人知道怎么做吗?

【问题讨论】:

    标签: c# asp.net-core-mvc asp.net-core-3.1 fluentvalidation


    【解决方案1】:

    所以我通过 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}]");
    }
    

    【讨论】:

      猜你喜欢
      • 2020-06-10
      • 1970-01-01
      • 2012-12-08
      • 2022-11-09
      • 1970-01-01
      • 2023-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多