ASP.NET Core自定义模型绑定错误:修改错误键$及合理性探讨
ASP.NET Core Web API 请求体校验错误键名修改问题
1. 如何修改错误键$的名称?
你可以通过自定义ValidationProblemDetailsFactory来替换默认的错误键名,核心思路是拦截框架生成校验问题详情的过程,将键中的$替换为你想要的名称。具体实现步骤如下:
步骤1:创建自定义校验问题详情工厂
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Infrastructure; using Microsoft.AspNetCore.Mvc.ModelBinding; public class CustomValidationProblemDetailsFactory : ValidationProblemDetailsFactory { private readonly ApiBehaviorOptions _apiBehaviorOptions; public CustomValidationProblemDetailsFactory(ApiBehaviorOptions apiBehaviorOptions) { _apiBehaviorOptions = apiBehaviorOptions; } public override ProblemDetails CreateValidationProblemDetails( HttpContext httpContext, ModelStateDictionary modelStateDictionary, int statusCode = StatusCodes.Status400BadRequest, string title = null, string type = null, string detail = null, string instance = null) { // 把所有错误键中的`$`替换为自定义名称,比如"requestBody" var modifiedModelState = new ModelStateDictionary(); foreach (var entry in modelStateDictionary) { var newKey = entry.Key.Replace("$", "requestBody"); modifiedModelState.Add(newKey, entry.Value); } return base.CreateValidationProblemDetails( httpContext, modifiedModelState, statusCode, title, type, detail, instance); } }
步骤2:注册自定义工厂到DI容器
在Program.cs中添加注册代码:
builder.Services.AddSingleton<ValidationProblemDetailsFactory, CustomValidationProblemDetailsFactory>();
这样当请求体类型不匹配(比如传入数组而非单个对象)时,错误键就会变成你指定的名称,比如requestBody。
2. 是否应该修改该键名?
是否修改取决于你的API使用场景:
- 不需要修改的场景:如果API面向熟悉REST规范或JSON Path的开发者,
$是JSON Path中根节点的标准表示,开发者能快速理解这是请求体根级别类型不匹配的错误,保持默认值更符合行业规范。 - 建议修改的场景:如果API面向非技术用户、前端开发团队,或者你希望错误格式的键名风格统一(比如其他错误键都是实体属性名),将
$改为requestBody或root这类直观名称,能降低理解成本,提升错误信息的友好性。
内容的提问来源于stack exchange,提问作者Stephan
相关产品推荐
相关产品推荐

