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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 10:06:06