You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

ASP.NET Core 8 MVC中[Required]特性返回命名空间而非自定义错误消息的问题

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-RequiredRequired Message Here
    Test.Features.Authentication.ViewModels.LoginPageViewModel.Password-RequiredRequired Message Here

    这样系统会从资源文件中读取错误消息,而不是显示资源键。

  • 方式2:明确指定本地化资源项
    直接在[Required]特性中指定要使用的资源项,而不是依赖自动生成的资源键:

    // 先确保你有对应的资源文件,比如SharedResource.resx
    [Required(ErrorMessageResourceName = "RequiredCommonMessage", ErrorMessageResourceType = typeof(SharedResource))]
    [Display(Name = "Email Address")]
    public string? EmailAddress { get; set; }
    

    然后在SharedResource.resx中添加RequiredCommonMessage对应的错误消息即可。

额外排查点

如果以上方法没用,再检查这两个地方:

  • 项目中有没有自定义的IValidationMetadataProviderIDisplayMetadataProvider实现类,这类自定义元数据提供程序可能会覆盖默认的错误消息逻辑。
  • 有没有自定义的ValidationAttribute子类,不小心修改了错误消息的生成规则。

你可以先试试注释本地化配置的方法,快速验证是不是这个问题,应该能直接解决你的情况!

火山引擎 最新活动