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

Web API模型验证未返回正确错误消息的技术咨询

如何获取数据注解中定义的自定义错误消息

我来帮你搞定这个问题——要拿到数据注解里设置的错误消息,核心是要正确提取ModelState里的错误信息,而不是直接返回默认的ModelState结构。下面给你两种实用的方案,按需选择:

1. 单个控制器内手动提取错误(快速实现)

首先先确认你的模型数据注解是带ErrorMessage的,比如:

public class myModel
{
    [Required(ErrorMessage = "myProperty属性不能为空")]
    [StringLength(30, ErrorMessage = "myProperty长度不能超过30个字符")]
    public string myProperty { get; set; }
}

然后修改你的API控制器验证逻辑,不要直接返回ModelState,而是提取里面的自定义错误消息:

[HttpPost]
public IActionResult PostMyModel([FromBody] myModel model)
{
    if (!ModelState.IsValid)
    {
        // 遍历提取所有自定义错误消息
        var errorMessages = ModelState
            .SelectMany(stateEntry => stateEntry.Value.Errors)
            .Select(error => error.ErrorMessage)
            .ToList();
        
        // 返回友好的错误结构
        return BadRequest(new { Errors = errorMessages });
    }

    // 后续业务逻辑
    return Ok("模型验证通过");
}

这样在Postman里收到的响应就会是清晰的自定义错误消息,比如:

{
  "Errors": [
    "myProperty属性不能为空"
  ]
}

2. 全局过滤器(所有控制器通用)

如果你的项目有多个控制器,不想每个都写重复代码,可以自定义一个模型验证过滤器,全局生效:

第一步:创建自定义过滤器类

public class CustomModelValidationFilter : IActionFilter
{
    public void OnActionExecuting(ActionExecutingContext context)
    {
        if (!context.ModelState.IsValid)
        {
            // 处理错误:优先取自定义ErrorMessage,没有则用异常信息
            var errors = context.ModelState
                .SelectMany(entry => entry.Value.Errors)
                .Select(error => 
                    string.IsNullOrEmpty(error.ErrorMessage) 
                        ? error.Exception?.Message ?? "验证失败" 
                        : error.ErrorMessage)
                .ToList();

            // 替换默认的验证失败响应
            context.Result = new BadRequestObjectResult(new 
            {
                Code = "400",
                Message = "模型验证失败",
                Errors = errors
            });
        }
    }

    public void OnActionExecuted(ActionExecutedContext context)
    {
        // 无需额外处理
    }
}

第二步:注册过滤器

在.NET 6+的Program.cs里注册:

builder.Services.AddControllers(options =>
{
    // 添加自定义验证过滤器
    options.Filters.Add<CustomModelValidationFilter>();
});

这样所有控制器的模型验证失败时,都会自动返回包含自定义错误消息的响应,不用再逐个控制器写验证逻辑。

关键注意事项

  • 一定要确保你的数据注解明确设置了ErrorMessage属性,不然会返回系统默认的验证提示。
  • 如果遇到模型绑定错误(比如传入的类型和属性不匹配),ErrorMessage可能为空,这时候可以用Exception.Message来兜底,就像上面过滤器里的处理那样。

内容的提问来源于stack exchange,提问作者Jim Evans

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:54:27