所有的校验信息都显示为“该值无效”,而不是实际的错误信息

编程语言 2026-07-10

我在ASP.NET项目中配置了本地化并启用了DataAnnotations的本地化。

builder.Services.AddControllersWithViews()
    .AddDataAnnotationsLocalization();
builder.Services.AddRazorPages();
builder.Services.AddLocalization(options => options.ResourcesPath = "Resources");

// ...
app.UseRequestLocalization(options => options.SetDefaultCulture("sr"));

我创建了 DataAnnotations.resxDataAnnotations.sr.resx 资源文件,在其中用我的语言(塞尔维亚语)编写了验证错误信息。

Resource

我把资源传递给DataAnnotations,在 RegisterViewModel

public class RegisterViewModel
{
    [DisplayName("email")]
    [DataType(DataType.EmailAddress)]
    [Required(ErrorMessageResourceName = "field_required", ErrorMessageResourceType = typeof(Resources.DataAnnotations))]
    [EmailAddress(ErrorMessageResourceName = "email_email", ErrorMessageResourceType = typeof(Resources.DataAnnotations))]
    public string Email { get; set; }
    [DisplayName("password1")]
    [DataType(DataType.Password)]
    [Required(ErrorMessageResourceName = "field_required", ErrorMessageResourceType = typeof(Resources.DataAnnotations))]
    public string Password { get; set; }
    [DisplayName("password2")]
    [DataType(DataType.Password)]
    [Required(ErrorMessageResourceName = "field_required", ErrorMessageResourceType = typeof(Resources.DataAnnotations))]
    [Compare("Password", ErrorMessageResourceName = "password2_confirmed", ErrorMessageResourceType = typeof(Resources.DataAnnotations))]
    public string Password2 { get; set; }
    [DisplayName("phone")]
    [Required(ErrorMessageResourceName = "field_required", ErrorMessageResourceType = typeof(Resources.DataAnnotations))]
    [Phone(ErrorMessageResourceName = "phone_phone", ErrorMessageResourceType = typeof(Resources.DataAnnotations))]
    public string Phone { get; set; }
    [DisplayName("firstName")]
    [Required(ErrorMessageResourceName = "field_required", ErrorMessageResourceType = typeof(Resources.DataAnnotations))]
    [Alpha(ErrorMessageResourceName = "field_alpha", ErrorMessageResourceType = typeof(Resources.DataAnnotations))]
    public string FirstName { get; set; }
    [DisplayName("lastName")]
    [Required(ErrorMessageResourceName = "field_required", ErrorMessageResourceType = typeof(Resources.DataAnnotations))]
    [Alpha(ErrorMessageResourceName = "field_alpha", ErrorMessageResourceType = typeof(Resources.DataAnnotations))]
    public string LastName { get; set; }
    [DisplayName("birthDate")]
    [DataType(DataType.Date)]
    [Required(ErrorMessageResourceName = "field_required", ErrorMessageResourceType = typeof(Resources.DataAnnotations))]
    [Adult(ErrorMessageResourceName = "birthDate_adult", ErrorMessageResourceType = typeof(Resources.DataAnnotations))]
    public DateOnly BirthDate { get; set; }
}

不知怎的,页面上所有的验证信息都显示为 The value '' is invalid.,而不是塞尔维亚语的那些。我在实现上缺少什么?

Error messages

解决方案

目前你通过 app.UseRequestLocalization(options => options.SetDefaultCulture("sr")) 设置默认语言环境的方式,可能导致受支持的语言环境和UI语言环境没有正确配置。

相反,使用 RequestLocalizationOptions 配置默认语言环境、受支持的语言环境以及受支持的UI语言环境,并使用提供者来根据查询字符串、Cookie、Accept-Language请求头等识别所选语言环境。

并通过 app.UseRequestLocalization() 初始化配置好的 RequestLocalizationOptions 对象。

用于注册服务与中间件管道的Program.cs应如下所示:

CultureInfo[] supportedCultures = new[]
{
    new CultureInfo("sr"),
    new CultureInfo("en"),
    // Other supported cultures
};

// Configure `RequestLocalizationOptions` 
builder.Services.Configure<RequestLocalizationOptions>(options =>
{
    options.DefaultRequestCulture = new RequestCulture("sr");
    options.SupportedCultures = supportedCultures;
    options.SupportedUICultures = supportedCultures;
    // Optional
    options.RequestCultureProviders = new List<IRequestCultureProvider>
    {
        new CookieRequestCultureProvider()
    };
});

...

// Initialize `RequestLocalizationOptions` object
app.UseRequestLocalization();

app.UseRouting();

参考:Configure Localization middleware

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章