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

如何在C#自定义响应模型中返回FluentValidation错误信息

C# Web API 自定义FluentValidation验证响应格式

问题背景

已在C# Web API项目中配置FluentValidation,验证功能正常,但验证失败时返回的默认BadRequest结构不符合自定义统一响应格式,需要将错误信息提取并转换为指定的Response结构。

默认验证失败响应

{
  "type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
  "title": "One or more validation errors occurred.",
  "status": 400,
  "traceId": "00-f3b3363d741fe7416fe40aea0ff13c36-d08e5eefbc2ff0ea-00",
  "errors": {
    "Code": [
      "'Code' must not be empty."
    ],
    "Name": [
      "'Name' must not be empty."
    ]
  }
}

现有验证器代码

public class AddRegionRequestValidator : AbstractValidator<AddRegionRequest>
{
    public AddRegionRequestValidator()
    {
        RuleFor(r=>r.Code).NotEmpty().NotNull().WithMessage("{property} is required");
        RuleFor(r=>r.Name).NotEmpty().NotNull().WithMessage("{property} is required");
    }
}

自定义统一响应类

public class Response{
    public bool IsSuccessful{get;set;}
    public dynamic Data{get;set;}
    public List<string> ErrorList{get;set;}
    public string Message{get;set;}
} 

期望输出响应格式

{
    "isSuccessful": false,
    "data": null,
    "errorList": [
        "'Code' must not be empty.",
        "'Name' must not be empty."
    ],
    "message": null
}

解决方案

1. 禁用默认ModelState验证响应

在Program.cs中配置MVC时,移除默认的ModelStateInvalidFilter,避免自动生成默认BadRequest响应:

builder.Services.AddControllers(options =>
{
    // 移除默认验证过滤器
    options.Filters.Remove<ModelStateInvalidFilter>();
})
.AddFluentValidation(fv => fv.RegisterValidatorsFromAssemblyContaining<AddRegionRequestValidator>());

2. 实现自定义验证过滤器

创建过滤器捕获FluentValidation抛出的ValidationException,将错误信息转换为自定义Response结构:

public class ValidationExceptionFilter : IExceptionFilter
{
    public void OnException(ExceptionContext context)
    {
        if (context.Exception is ValidationException validationException)
        {
            // 提取所有验证错误信息
            var errorList = validationException.Errors.Select(e => e.ErrorMessage).ToList();
            
            // 构造自定义响应对象
            var customResponse = new Response
            {
                IsSuccessful = false,
                Data = null,
                ErrorList = errorList,
                Message = null
            };

            // 返回400状态码与自定义响应
            context.Result = new BadRequestObjectResult(customResponse);
            // 标记异常已处理
            context.ExceptionHandled = true;
        }
    }
}

3. 注册自定义过滤器

在Program.cs中将自定义过滤器添加到MVC配置中:

builder.Services.AddControllers(options =>
{
    options.Filters.Remove<ModelStateInvalidFilter>();
    // 注册自定义验证异常过滤器
    options.Filters.Add<ValidationExceptionFilter>();
})
.AddFluentValidation(fv => fv.RegisterValidatorsFromAssemblyContaining<AddRegionRequestValidator>());

补充:兼容非FluentValidation的ModelState错误

若项目中存在其他ModelState验证场景(如原生数据注解验证),可修改过滤器同时处理这类情况:

public class ValidationExceptionFilter : IActionFilter
{
    public void OnActionExecuting(ActionExecutingContext context)
    {
        if (!context.ModelState.IsValid)
        {
            // 提取原生ModelState错误信息
            var errorList = context.ModelState.Values
                .SelectMany(v => v.Errors)
                .Select(e => e.ErrorMessage)
                .ToList();

            var customResponse = new Response
            {
                IsSuccessful = false,
                Data = null,
                ErrorList = errorList,
                Message = null
            };

            context.Result = new BadRequestObjectResult(customResponse);
        }
    }

    public void OnActionExecuted(ActionExecutedContext context)
    {
        // 处理FluentValidation抛出的异常
        if (context.Exception is ValidationException validationException)
        {
            var errorList = validationException.Errors.Select(e => e.ErrorMessage).ToList();
            
            var customResponse = new Response
            {
                IsSuccessful = false,
                Data = null,
                ErrorList = errorList,
                Message = null
            };

            context.Result = new BadRequestObjectResult(customResponse);
            context.ExceptionHandled = true;
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 11:46:07