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

.NET API如何本地化原生错误‘The X field is required’?

解决.NET 7 API模型绑定必填错误消息本地化问题

问题根源

你遇到的The X field is required错误,属于模型绑定阶段的提示,而非DataAnnotations中[Required]属性的验证错误——这就是之前的本地化配置覆盖不到它的核心原因。

无需逐个加[Required]的解决方案

方案1:直接配置ModelBinding的本地化资源

  1. 创建本地化资源文件
    在项目中新建Resources文件夹,添加:

    • ModelBinding.resx(默认英文,可留空或保留原消息)
    • ModelBinding.zh-CN.resx(中文翻译),在其中添加键值对:
      键值
      The {0} field is required{0}字段是必填项
  2. 注册本地化服务并配置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:全局过滤器批量替换错误消息

如果不想修改资源配置,也可以通过全局过滤器捕获并替换错误:

  1. 创建过滤器类
    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) { }
    }
    
  2. 注册过滤器
    在Program.cs中:
    builder.Services.AddControllers(options =>
    {
        options.Filters.Add<LocalizeModelBindingErrorsFilter>();
    });
    

额外注意

  • 确保资源文件的生成操作设置为「嵌入的资源」,否则无法被读取
  • 确认请求的文化已被正确识别(比如通过Accept-Language请求头、路由参数等方式配置文化中间件)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 05:05:16