You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FluentValidation验证List<AdvancedFilter>时未触发内部List<string>校验

ASP.NET Core 6 + FluentValidation 11.3.0 集合参数验证不触发问题解决方案

问题原因

ASP.NET Core默认不会自动对顶级集合参数(如直接接收List<AdvancedFilter>)中的每个元素应用对应的FluentValidation验证器。只有当集合作为某个模型类的属性存在时,验证框架才会遍历集合元素并执行各自的验证规则。

解决方案

方案1:使用包装类包裹集合(推荐)

创建一个包含集合属性的请求模型,控制器接收该包装类参数,FluentValidation会自动验证集合内的每个AdvancedFilter对象。

代码示例

// 新增包装类
public class AdvancedFilterRequest
{
    public List<AdvancedFilter> Filters { get; set; }
}

// 修改控制器接口
[HttpPost("test")]
public IActionResult Test([FromBody] AdvancedFilterRequest request)
{
    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }
    return Ok(request.Filters.First());
}

// 验证器保持原有逻辑(含附加需求规则)
public class AdvancedFilterValidator : AbstractValidator<AdvancedFilter>
{
    public AdvancedFilterValidator()
    {
        // 基础规则:Values非空且每个元素长度≥20
        RuleFor(x => x.Values)
            .NotEmpty().WithMessage("Values不能为空")
            .ForEach(x => x.MinimumLength(20).WithMessage("Values中每个元素长度不能小于20"));

        // 附加需求:Column为Jurisdiction时,Values每个元素需可解析为整数
        When(x => x.Column == AdvancedFilterColumn.Jurisdiction, () =>
        {
            RuleForEach(x => x.Values)
                .Must(val => int.TryParse(val, out _))
                .WithMessage("Jurisdiction类型的Values元素必须是可解析的整数");
        });
    }
}

方案2:手动在控制器中执行验证

若不想修改请求结构,可注入IValidator<AdvancedFilter>,手动遍历集合元素验证并将错误添加到ModelState。

代码示例

// 控制器注入验证器
private readonly IValidator<AdvancedFilter> _filterValidator;

public YourController(IValidator<AdvancedFilter> filterValidator)
{
    _filterValidator = filterValidator;
}

// 修改控制器接口
[HttpPost("test")]
public IActionResult Test([FromBody] List<AdvancedFilter> filters)
{
    foreach (var filter in filters)
    {
        var validationResult = _filterValidator.Validate(filter);
        if (!validationResult.IsValid)
        {
            foreach (var error in validationResult.Errors)
            {
                ModelState.AddModelError($"Filters[{filters.IndexOf(filter)}].{error.PropertyName}", error.ErrorMessage);
            }
        }
    }

    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }

    return Ok(filters.First());
}

附加需求验证说明

采用上述任一方案后,附加的Jurisdiction类型校验规则会自动生效。例如传入Column为AdvancedFilterColumn.Jurisdiction且Values包含非整数字符串时,验证框架会返回对应的错误信息。

内容的提问来源于stack exchange,提问作者Robert J.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 11:35:06