如何在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
相关产品推荐
相关产品推荐

