ASP.NET Core 8 MVC中[Required]特性返回命名空间而非自定义错误消息的问题
这种情况我之前排查过好几次,大概率是数据注解本地化的配置干扰了默认的错误消息逻辑!
问题原因
从你渲染的HTML里的data-val-required值(Test.Features.Authentication.ViewModels.LoginPageViewModel.EmailAddress-Required)来看,这明显是本地化资源键的格式——ASP.NET Core如果配置了数据注解本地化,会自动将验证规则的错误消息替换为资源键,当对应的资源文件中没有找到这个键的对应值时,就会直接显示资源键本身,也就是你看到的带命名空间的字符串,而非你在[Required]特性里写的ErrorMessage。
解决方案
根据你的需求,分两种情况处理:
情况1:不需要本地化功能
直接找到Program.cs中类似这样的配置代码,注释或删除它:
builder.Services.AddControllersWithViews() .AddDataAnnotationsLocalization(options => { options.DataAnnotationLocalizerProvider = (type, factory) => factory.Create(typeof(SharedResource)); // 这类配置就是元凶 });
删除后,ASP.NET Core会直接使用[Required(ErrorMessage = "...")]中定义的错误消息,你的问题应该就能解决。
情况2:需要保留本地化功能
如果你的项目需要多语言支持,那可以通过以下两种方式调整:
方式1:补充资源文件的键值对
在你指定的本地化资源文件(比如SharedResource.resx)中,添加对应的资源键和值:资源键 资源值 Test.Features.Authentication.ViewModels.LoginPageViewModel.EmailAddress-Required Required Message Here Test.Features.Authentication.ViewModels.LoginPageViewModel.Password-Required Required Message Here 这样系统会从资源文件中读取错误消息,而不是显示资源键。
方式2:明确指定本地化资源项
直接在[Required]特性中指定要使用的资源项,而不是依赖自动生成的资源键:// 先确保你有对应的资源文件,比如SharedResource.resx [Required(ErrorMessageResourceName = "RequiredCommonMessage", ErrorMessageResourceType = typeof(SharedResource))] [Display(Name = "Email Address")] public string? EmailAddress { get; set; }然后在
SharedResource.resx中添加RequiredCommonMessage对应的错误消息即可。
额外排查点
如果以上方法没用,再检查这两个地方:
- 项目中有没有自定义的
IValidationMetadataProvider或IDisplayMetadataProvider实现类,这类自定义元数据提供程序可能会覆盖默认的错误消息逻辑。 - 有没有自定义的
ValidationAttribute子类,不小心修改了错误消息的生成规则。
你可以先试试注释本地化配置的方法,快速验证是不是这个问题,应该能直接解决你的情况!




