如何在ASP.NET Core WebAPI中提取验证错误并自定义返回格式
自定义ASP.NET Core WebAPI模型验证错误返回格式
在.NET 6的ASP.NET Core WebAPI中,模型验证失败时默认返回的是ValidationProblemResult类型的结果,你不需要从context.Result.Value中提取错误,直接强转context.Result为ValidationProblemResult即可获取完整的验证错误信息。
提取验证错误的核心方法
在你的ReformatValidationProblemAttribute中,重写OnResultExecuting方法,通过以下步骤提取错误:
- 判断当前结果是否为模型验证失败的结果
- 从
ValidationProblemResult的ModelState属性中提取错误,支持两种常用格式:- 所有错误消息的扁平列表
- 按字段名分组的错误字典
完整代码示例
public class ReformatValidationProblemAttribute : ActionFilterAttribute { public override void OnResultExecuting(ResultExecutingContext context) { if (context.Result is ValidationProblemResult validationResult) { // 提取所有错误消息的扁平列表 var allErrorMessages = validationResult.ModelState .SelectMany(kvp => kvp.Value.Errors) .Select(error => error.ErrorMessage) .ToList(); // 提取按字段分组的错误字典(键为字段名,值为该字段的错误列表) var fieldSpecificErrors = validationResult.ModelState .ToDictionary( kvp => kvp.Key, kvp => kvp.Value.Errors.Select(e => e.ErrorMessage).ToList() ); // 用自定义类封装错误(这里替换成你自己的自定义类) var customResponse = new { StatusCode = validationResult.StatusCode, Message = "请求参数验证失败", AllErrors = allErrorMessages, FieldErrors = fieldSpecificErrors }; // 替换为自定义格式的JSON返回 context.Result = new JsonResult(customResponse) { StatusCode = validationResult.StatusCode }; } base.OnResultExecuting(context); } }
注册Filter
在Program.cs中全局注册该Filter,对所有接口生效:
builder.Services.AddControllers(options => { options.Filters.Add<ReformatValidationProblemAttribute>(); });
或者仅在特定Controller/Action上添加特性:
[ApiController] [Route("api/[controller]")] [ReformatValidationProblem] public class UserController : ControllerBase { // 接口方法... }
注意事项
- 确保模型类正确使用数据验证特性,如
[Required]、[EmailAddress]等 - GET请求的模型绑定来自QueryString,需保证模型属性名与Query参数名一致
ValidationProblemResult的StatusCode默认是400,可根据需求调整
内容的提问来源于stack exchange,提问作者KeithViking
相关产品推荐
相关产品推荐

