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

如何在ASP.NET Core WebAPI中提取验证错误并自定义返回格式

自定义ASP.NET Core WebAPI模型验证错误返回格式

在.NET 6的ASP.NET Core WebAPI中,模型验证失败时默认返回的是ValidationProblemResult类型的结果,你不需要从context.Result.Value中提取错误,直接强转context.Result为ValidationProblemResult即可获取完整的验证错误信息。

提取验证错误的核心方法

在你的ReformatValidationProblemAttribute中,重写OnResultExecuting方法,通过以下步骤提取错误:

  1. 判断当前结果是否为模型验证失败的结果
  2. 从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 12:07:26