ASP.NET Core 5中Fluent Validation自定义消息和错误码返回异常问题
问题解决:ASP.NET Core 5中Fluent Validation自定义错误码/消息错位问题
根因定位
你的Fluent Validation校验规则配置本身没有错误,出现字段错位是校验失败后的响应转换逻辑对Fluent Validation的字段映射错误:
WithMessage()设置的内容会存入ValidationFailure.ErrorMessage属性WithErrorCode()设置的内容会存入ValidationFailure.ErrorCode属性- 你当前项目的错误转换逻辑错误地将
ErrorMessage的值赋值给了响应的errorCode字段,没有读取ErrorCode属性,导致字段对应关系完全错位。
修复步骤
1. 找到响应转换逻辑
项目中控制校验失败返回格式的逻辑一般存在两个位置:
- 全局请求校验过滤器(实现
IActionFilter接口) - 启动配置中的
ApiBehaviorOptions委托,示例错误配置如下:
// Startup.cs/Program.cs 中的错误配置样例 services.Configure<ApiBehaviorOptions>(options => { options.InvalidModelStateResponseFactory = context => { var firstError = context.ModelState.Values .SelectMany(v => v.Errors) .First(); // 错误映射:把错误消息赋值给了errorCode字段 return new BadRequestObjectResult(new { message = "Bad Request", errorCode = firstError.ErrorMessage }); }; });
注意:如果项目用了自定义全局校验过滤器而非
ApiBehaviorOptions处理校验失败,对应修改过滤器中的响应构造逻辑即可,核心映射逻辑和下述代码一致。
2. 修改映射逻辑(兼容Fluent Validation 9&10版本)
修改转换逻辑,从CustomState中读取Fluent Validation原生的ValidationFailure对象,分别映射字段:
services.Configure<ApiBehaviorOptions>(options => { options.InvalidModelStateResponseFactory = context => { var firstError = context.ModelState.Values .SelectMany(v => v.Errors) .FirstOrDefault(); string errorCode = "VALIDATION_FAILED"; string errorMsg = "参数校验失败"; if (firstError != null) { // 读取Fluent Validation的原始校验错误对象,兼容9、10版本 var validationFailure = firstError.CustomState as FluentValidation.Results.ValidationFailure; if (validationFailure != null) { errorCode = validationFailure.ErrorCode; errorMsg = validationFailure.ErrorMessage; } // 兼容系统默认数据注解校验的错误 else { errorMsg = firstError.ErrorMessage; } } // 如果你需要保留message为固定的"Bad Request",只修改errorCode的取值即可 return new BadRequestObjectResult(new { message = "Bad Request", // 也可以改成message = errorMsg 按业务需求调整 errorCode = errorCode }); }; });
3. 验证效果
修复后触发校验,返回结果符合预期:
{ "message": "Bad Request", "errorCode": "MY_ERROR_CODE_1" }
内容的提问来源于stack exchange,提问作者giacomo
相关产品推荐
相关产品推荐

