我有以下模型(为简洁起见进行了简化)
public class AdvancedFilter
{
public List<string> Values { get; set; }
}
然后我的 ApiController 如下
[HttpPost("test")]
public AdvancedFilter Test(List<AdvancedFilter> filters)
{
return filters.First();
}
现在我的验证器看起来如下
public class AdvancedFilterValidator : AbstractValidator<AdvancedFilter>
{
public AdvancedFilterValidator()
{
RuleFor(x => x.Values).NotEmpty().ForEach(x => x.MinimumLength(20));
//RuleForEach(x => x.Values).MinimumLength(20); (tried both approaches, none of them worked for me)
}
}
当我尝试使用无效的 paylaod 调用我的端点时,例如
[
{
"values":["test"]
}
]
它不会向我抛出验证异常。有趣的是,当我更改我的控制器以接受像这样的单个对象时,流畅的验证突然按预期启动。
[HttpPost("test")]
public AdvancedFilter Test(AdvancedFilter filters)
{
return filters;
}
我正在使用 ASP Net Core v 6
FluentValidation.AspNetCore
版本“11.3.0”(最新)
奖金问题: 我进行此验证的最终目标是确保所有输入值都是数字(即使它们是字符串,在某些情况下我需要确保它们是 int)。扩展模型会照亮它(仍然简化)
public class AdvancedFilter
{
public AdvancedFilterColumn Column { get; set; }
public List<string> Values { get; set; }
}
public class AdvancedFilterValidator : AbstractValidator<AdvancedFilter>
{
public AdvancedFilterValidator()
{
When(x => x.Column == AdvancedFilterColumn.Jurisdiction, () =>
{
RuleForEach(x => x.Values).Must(x => int.TryParse(x, out _));
});
}
}
正如您在特定情况下所看到的,当 Column 是 Jurisdiction 时,我需要确保传入的值都是数字。我相信验证规则写得正确,但我无法测试它(由于上述问题)。
对于此事的任何帮助将不胜感激。
认为您需要构建一个验证器来验证
AdvancedFilter
集合。
public class AdvancedFilterCollectionValidator : AbstractValidator<IEnumerable<AdvancedFilter>>
{
public AdvancedFilterCollectionValidator()
{
RuleForEach(x => x).SetValidator(new AdvancedFilterValidator());
}
}
并在
ConfigureServices
方法中注册validator服务。
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
// Other configurations
services.AddScoped<IValidator<IEnumerable<AdvancedFilter>>, AdvancedFilterCollectionValidator>();
}