列表参数的 FluentValidation

发布于 2025-01-17 23:09:51 字数 1082 浏览 1 评论 0原文

我们有一个现有的 API 端点,其签名如下(简化):

[HttpPost("api/v1/data")]
public DataSubmission SubmitData([FromBody] List<DataItem> items) {
  ...
}

public class DataItemValidator : AbstractValidator<DataItem> {
  // RuleFor(...)
}

我们已经为 DataItem 定义了一个验证器,但我们不知道如何在各个列表项上注册验证。对于列表作为属性公开的常规输入模型,使用 RuleForEach(x => x.ListPropertyName).SetValidator(...) 很方便,但我们找不到一个设置当要验证的模型本身是一个列表时,我们可以验证项目。

我们尝试为此列表定义一个派生模型,并为其创建一个验证器,如下所示:

public class DataItemList : List<DataItem> {
}

public class DataItemListValidator : AbstractValidator<DataItemList> {
  public DataItemListValidator(){
    // How to set validator for items list??
  }
}

我们是否以错误的方式处理此问题,或者是否有其他方法来处理这种情况?

编辑:我知道 FluentValidation 不适合验证参数(https://github.com/ FluentValidation/FluentValidation/issues/337),但我不确定这是否也适用,因为它似乎有点灰色区域

We have an existing API endpoint with a signature like the following (simplified):

[HttpPost("api/v1/data")]
public DataSubmission SubmitData([FromBody] List<DataItem> items) {
  ...
}

public class DataItemValidator : AbstractValidator<DataItem> {
  // RuleFor(...)
}

We have defined a validator for the DataItem but we cannot figure out how to register the validation on the individual list items. For regular input models where the list is exposed as a property, it is convenient to use RuleForEach(x => x.ListPropertyName).SetValidator(...) but we fail to find a setup where we can validate the items when the model to validate is a list in itself.

We have attempted to define a derived model for this list and create a validator for it like this:

public class DataItemList : List<DataItem> {
}

public class DataItemListValidator : AbstractValidator<DataItemList> {
  public DataItemListValidator(){
    // How to set validator for items list??
  }
}

Are we going about this the wrong way or are there other ways to handle this scenario?

EDIT: I am aware of FluentValidation not being suitable for validating parameters (https://github.com/FluentValidation/FluentValidation/issues/337) but I am not sure if this applies as well since it seems to be somewhat of a grey area

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

心病无药医 2025-01-24 23:09:51

(在发布问题后不久找到答案)

我们可以使用派生模型和特定的 RuleForEach 语法来实现验证:

public class DataListItemValidator : AbstractValidator<DataItemList> {
  public DataListItemValidator() {
    RuleForEach(x => x).SetValidator(new DataItemValidator());
  }
}

这里的关键是允许迭代元素的 (x => x)本身。

(Found an answer shortly after posting question)

We can achieve the validation using the derived model and a specific RuleForEach syntax:

public class DataListItemValidator : AbstractValidator<DataItemList> {
  public DataListItemValidator() {
    RuleForEach(x => x).SetValidator(new DataItemValidator());
  }
}

The key here is the (x => x) that allows for iterating the element of itself.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文