【问题标题】:Fluent Validation - Validator for "Pure" collectionFluent Validation - “纯”集合的验证器
【发布时间】:2020-03-12 08:54:12
【问题描述】:

我的 API 支持批量创建实体。 FluentValidation 如何支持纯集合的验证?

这是控制器的创建批量签名:

[HttpPost]
public Task<IActionResult> CreateBulk([FromBody] IEnumerable<MyClass> model))

我想通过实现基于FluentValidation 的验证器来验证发送的集合不为空或为空。

【问题讨论】:

  • 不确定是否可行。我认为您需要创建一个 dto/view 模型,使集合成为 dto 的属性,为 dto 创建一个验证器,并在属性上使用验证规则,然后更新此方法以接受 dto。无论如何,我通常会这样做。
  • @rgvlee 感谢您的评论,但我需要明确的答案。关于这个问题,我达到了相同的终点

标签: c# asp.net-core fluentvalidation


【解决方案1】:

最初我认为这是不可能的,但事实证明这是可以做到的。归根结底,集合是一个容器,因此您应该能够为它创建一个验证器,就像为任何其他具有子列表的容器一样。

解决方案是为集合本身定义一个验证器:

public class ListOfMyClassValidator : AbstractValidator<List<MyClass>>
{
    public ListOfMyClassValidator()
    {
        RuleFor(x => x).Must(x => x.Any()).WithMessage("The list cannot be empty");

        RuleForEach(x => x).SetValidator(new MyClassValidator());
    }
}

我在这里指定了RuleForEach,这样每个列表项也会被验证(如果你有MyClass 验证器)。您可以在配置 FV 时通过将 ImplicitlyValidateChildProperties 设置为 true 来跳过这一部分,但建议使用前一种方法。

我确实用IEnumerable&lt;MyClass&gt; 尝试过这个,但是没有触发验证器。与IList&lt;MyClass&gt; 相同。我还没有调查为什么模型绑定器在功能上很高兴绑定到List&lt;T&gt;

Working solution

【讨论】:

  • 你是如何实现这个类的?仓库也没有实现。
  • 当我请求带有空序列的 POST 端点时,工作解决方案对我有用。我将在我的答案中添加屏幕截图。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-10
  • 2011-12-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多