.NET API如何本地化原生错误‘The X field is required’?
解决.NET 7 API模型绑定必填错误消息本地化问题
问题根源
你遇到的The X field is required错误,属于模型绑定阶段的提示,而非DataAnnotations中[Required]属性的验证错误——这就是之前的本地化配置覆盖不到它的核心原因。
无需逐个加[Required]的解决方案
方案1:直接配置ModelBinding的本地化资源
创建本地化资源文件
在项目中新建Resources文件夹,添加:ModelBinding.resx(默认英文,可留空或保留原消息)ModelBinding.zh-CN.resx(中文翻译),在其中添加键值对:键 值 The {0} field is required {0}字段是必填项
注册本地化服务并配置ModelBinding消息
在Program.cs中:// 注册本地化服务,指定资源文件路径 builder.Services.AddLocalization(options => options.ResourcesPath = "Resources"); builder.Services.AddControllers() // 保持你之前的DataAnnotations本地化配置 .AddDataAnnotationsLocalization(options => { options.DataAnnotationLocalizerProvider = (type, factory) => factory.Create(typeof(SharedResources)); // 替换为你已有的共享资源类型 }) .AddMvcOptions(options => { // 获取ModelBinding资源的本地化器 var modelBindingLocalizer = builder.Services.BuildServiceProvider() .GetRequiredService<IStringLocalizer<ModelBinding>>(); // 覆盖必填字段的错误消息 options.ModelBindingMessageProvider.SetValueIsRequiredAccessor( fieldName => modelBindingLocalizer["The {0} field is required", fieldName]); });
方案2:全局过滤器批量替换错误消息
如果不想修改资源配置,也可以通过全局过滤器捕获并替换错误:
- 创建过滤器类
public class LocalizeModelBindingErrorsFilter : IActionFilter { private readonly IStringLocalizer<ModelBinding> _localizer; public LocalizeModelBindingErrorsFilter(IStringLocalizer<ModelBinding> localizer) { _localizer = localizer; } public void OnActionExecuting(ActionExecutingContext context) { if (!context.ModelState.IsValid) { foreach (var entry in context.ModelState.Values) { foreach (var error in entry.Errors.Where(e => e.ErrorMessage.StartsWith("The ") && e.ErrorMessage.EndsWith(" field is required"))) { // 提取字段名并替换为本地化消息 var fieldName = error.ErrorMessage.Split(' ', StringSplitOptions.RemoveEmptyEntries)[1]; error.ErrorMessage = _localizer["The {0} field is required", fieldName]; } } } } public void OnActionExecuted(ActionExecutedContext context) { } } - 注册过滤器
在Program.cs中:builder.Services.AddControllers(options => { options.Filters.Add<LocalizeModelBindingErrorsFilter>(); });
额外注意
- 确保资源文件的生成操作设置为「嵌入的资源」,否则无法被读取
- 确认请求的文化已被正确识别(比如通过
Accept-Language请求头、路由参数等方式配置文化中间件)
内容的提问来源于stack exchange,提问作者ervin
相关产品推荐
相关产品推荐

