如何解决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")); } }
注意事项
- 如果需要校验
Taxes集合本身为null的场景,必须单独为Taxes属性添加NotNull校验规则,RuleForEach不会触发null集合的校验 - 所有校验类必须继承
AbstractValidator<T>,且公共无参构造函数中定义规则 - 确保FluentValidation.AspNetCore Nuget包版本与项目.NET版本兼容
- 如果使用FluentValidation 11及以下版本,自动校验和注册合并为同一个配置方法,无需单独调用
AddValidatorsFromAssemblyContaining,示例:
builder.Services.AddControllers() .AddFluentValidation(fv => { fv.RegisterValidatorsFromAssemblyContaining<ChargeCreateRequestValidator>(); });
内容的提问来源于stack exchange,提问作者Rasik
相关产品推荐
相关产品推荐

