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

如何解决Swagger发送Post请求时FluentValidation嵌套属性校验不生效问题

解决方案
  • 第一步:为父请求模型创建校验器,显式关联嵌套类的校验规则
    FluentValidation不会自动加载嵌套类型的校验器,必须在父类校验器中显式指定应用规则。新增父类校验器代码如下:
public class ChargeCreateRequestValidator : AbstractValidator<ChargeCreateRequestModel>
{
    public ChargeCreateRequestValidator()
    {
        // 可选:校验集合本身不能为空
        RuleFor(x => x.Taxes)
            .NotNull()
            .WithMessage("税费集合不能为空");

        // 为集合中每个元素应用TaxValidator的校验规则
        RuleForEach(x => x.Taxes)
            .SetValidator(new TaxValidator());
    }
}
  • 第二步:检查FluentValidation服务注册配置
    确保Program.cs中已开启自动校验,且所有校验器都被注册到容器中,.NET 6+、FluentValidation 11+版本示例配置如下:
var builder = WebApplication.CreateBuilder(args);

// 添加控制器服务
builder.Services.AddControllers()
    // 开启FluentValidation自动校验,请求进入Action前自动执行校验
    .AddFluentValidationAutoValidation();

// 注册所有校验器,替换为你项目中任意一个校验器所在的类即可,同一程序集内的所有校验器会被批量注册
builder.Services.AddValidatorsFromAssemblyContaining<ChargeCreateRequestValidator>();

// 其他服务注册...

var app = builder.Build();

// 中间件配置...
app.MapControllers();
app.Run();
  • 可选:手动校验方案
    如果不想开启全局自动校验,可以在控制器中注入校验器手动执行校验:
[ApiController]
[Route("api/[controller]")]
public class ChargeController : ControllerBase
{
    private readonly IValidator<ChargeCreateRequestModel> _requestValidator;
    private readonly IChargeService _chargeService;

    public ChargeController(IValidator<ChargeCreateRequestModel> requestValidator, IChargeService chargeService)
    {
        _requestValidator = requestValidator;
        _chargeService = chargeService;
    }

    [HttpPost]
    [ProducesResponseType(typeof(ApiResponse<string>), (int)HttpStatusCode.OK)]
    public async Task<ActionResult> CreateCharge([FromBody] ChargeCreateRequestModel requestModel)
    {
        // 手动执行校验
        var validationResult = await _requestValidator.ValidateAsync(requestModel);
        if (!validationResult.IsValid)
        {
            return BadRequest(validationResult.Errors.Select(e => e.ErrorMessage));
        }
        await _chargeService.CreateChargeAsync(requestModel);
        return Ok(new ApiResponse<string>("List of charge"));
    }
}

注意事项

  1. 如果需要校验Taxes集合本身为null的场景,必须单独为Taxes属性添加NotNull校验规则,RuleForEach不会触发null集合的校验
  2. 所有校验类必须继承AbstractValidator<T>,且公共无参构造函数中定义规则
  3. 确保FluentValidation.AspNetCore Nuget包版本与项目.NET版本兼容
  4. 如果使用FluentValidation 11及以下版本,自动校验和注册合并为同一个配置方法,无需单独调用AddValidatorsFromAssemblyContaining,示例:
builder.Services.AddControllers()
    .AddFluentValidation(fv => 
    {
        fv.RegisterValidatorsFromAssemblyContaining<ChargeCreateRequestValidator>();
    });

内容的提问来源于stack exchange,提问作者Rasik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 20:06:03