当输入属性是对象列表时,FluentValidation 不会验证 List<string>

问题描述 投票:0回答:1

我有以下模型(为简洁起见进行了简化)

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 时,我需要确保传入的值都是数字。我相信验证规则写得正确,但我无法测试它(由于上述问题)。

对于此事的任何帮助将不胜感激。

c# asp.net-core validation asp.net-core-webapi fluentvalidation
1个回答
0
投票

认为您需要构建一个验证器来验证

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>();
}

参考:Validation for a for Collection of a type at Root level?

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.