List 参数的 FluentValidation
FluentValidation for List parameter
我们有一个现有的 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) 但我不确定这是否适用,因为它似乎有点灰色区域
(发布问题后很快找到答案)
我们可以使用派生模型和特定的 RuleForEach 语法实现验证:
public class DataListItemValidator : AbstractValidator<DataItemList> {
public DataListItemValidator() {
RuleForEach(x => x).SetValidator(new DataItemValidator());
}
}
这里的关键是 (x => x)
允许迭代自身的元素。
我们有一个现有的 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) 但我不确定这是否适用,因为它似乎有点灰色区域
(发布问题后很快找到答案)
我们可以使用派生模型和特定的 RuleForEach 语法实现验证:
public class DataListItemValidator : AbstractValidator<DataItemList> {
public DataListItemValidator() {
RuleForEach(x => x).SetValidator(new DataItemValidator());
}
}
这里的关键是 (x => x)
允许迭代自身的元素。