ASP.NET Core中DisplayNameFor无法读取Resx文件,本地化失效
ASP.NET Core 本地化:DisplayNameFor与Display特性无法读取Resx文件问题解决
问题描述
在Login.cshtml中注入IStringLocalizer<LoginModel>和IHtmlLocalizer<LoginModel>后,二者均可正常从Resx文件获取翻译,但@Html.DisplayNameFor(m => m.Input.RememberMe)无法读取资源文件,同时LoginModel中RememberMe属性的[Display(Name = "Remember")]特性也无法关联到同一份资源,资源文件结构正确但渲染结果无翻译。
相关代码
Login.cshtml
@page @using Microsoft.AspNetCore.Mvc.Localization @using Microsoft.Extensions.StringLocalization @inject IStringLocalizer<LoginModel> localizer @inject IHtmlLocalizer<LoginModel> htmlLocalizer @model LoginModel <h1>@htmlLocalizer["Title"]</h1> <!-- 翻译正常 --> <h1>@localizer["Title"]</h1> <!-- 翻译正常 --> [...] <div class="checkbox"> <label asp-for="Input.RememberMe" class="form-label"> <input class="form-check-input" asp-for="Input.RememberMe" /> @Html.DisplayNameFor(m => m.Input.RememberMe) <!-- 无法读取Resx --> </label> </div>
Login.cshtml.cs
/// <summary> /// This API supports the ASP.NET Core Identity default UI infrastructure and is not intended to be used /// directly from your code. This API may change or be removed in future releases. /// </summary> [Display(Name = "Remember")] // 无法读取Resx public bool RememberMe { get; set; }
解决方法
1. 修正[Display]特性的资源关联
默认的[Display(Name = "Remember")]只是硬编码字符串,不会自动关联Resx文件。需要指定ResourceType参数,明确指向你的资源类:
// 替换为你的Resx对应的自动生成类名,比如LoginModelResource(若Resx文件名为LoginModel.resx) [Display(Name = "Remember", ResourceType = typeof(LoginModelResource))] public bool RememberMe { get; set; }
2. 确保资源文件配置正确
- 命名规则:Resx文件名需与模型类匹配,比如主文件
LoginModel.resx,本地化版本LoginModel.zh-CN.resx - 工具配置:右键Resx文件→属性,设置
自定义工具为ResXFileCodeGenerator,自定义工具命名空间与模型类所在命名空间一致 - 访问权限:在Resx编辑器顶部,将访问修饰符设置为
Public,确保生成的资源类能被模型访问
3. 快速替代方案:直接使用注入的Localizer
如果不想修改特性,可以绕过DisplayNameFor,直接用已验证有效的本地化实例获取翻译:
<!-- 替换原来的@Html.DisplayNameFor(...) --> @htmlLocalizer["Remember"]
额外检查
确认Program.cs/Startup.cs中已正确配置本地化服务:
builder.Services.AddLocalization(options => options.ResourcesPath = "Resources"); // 配置支持的文化,示例: var supportedCultures = new[] { "en", "zh-CN" }; app.UseRequestLocalization(new RequestLocalizationOptions { DefaultRequestCulture = new RequestCulture("en"), SupportedCultures = supportedCultures, SupportedUICultures = supportedCultures });
内容的提问来源于stack exchange,提问作者Yoda
相关产品推荐
相关产品推荐

