求助:Razor的Html.DisplayFor未按线程文化加载本地化资源
排查Razor本地化未加载对应文化资源的问题
我来帮你排查下Razor始终返回中性资源文件的问题,结合你给出的代码和资源信息,咱们一步步来分析:
1. 先确认本地化资源文件的命名与结构
首先得保证不同文化的资源文件命名完全符合规范,比如:
- 中性资源:
PurchaseOrderModelRes.resx - 中文简体资源:
PurchaseOrderModelRes.zh-CN.resx - 法语(法国)资源:
PurchaseOrderModelRes.fr-FR.resx
这些本地化资源必须和中性资源放在同一个文件夹里,而且所有资源文件的访问修饰符都要设为public——你提到中性资源是“publ...”,记得别漏了其他本地化资源的设置,不然Razor没法访问到它们。
2. 检查当前线程的文化设置是否正确
Razor是靠当前线程的CurrentCulture和CurrentUICulture来匹配资源的,你得确认这两个值已经设成了你期望的文化。这里分两种项目类型给你示例:
ASP.NET Core 配置示例
// Startup.cs using Microsoft.AspNetCore.Localization; using System.Globalization; public void ConfigureServices(IServiceCollection services) { // 如果资源放在专门的Resources文件夹,就加上这句;和模型同文件夹的话可以省略 services.AddLocalization(options => options.ResourcesPath = "Resources"); services.Configure<RequestLocalizationOptions>(options => { var supportedCultures = new[] { new CultureInfo("en-US"), new CultureInfo("zh-CN"), new CultureInfo("fr-FR") }; options.DefaultRequestCulture = new RequestCulture("en-US"); options.SupportedCultures = supportedCultures; options.SupportedUICultures = supportedCultures; }); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { // 注意:这个中间件要放在路由中间件之前 app.UseRequestLocalization(); app.UseRouting(); // 其他中间件... }
ASP.NET Framework 配置示例
// Global.asax protected void Application_BeginRequest(object sender, EventArgs e) { // 替换成你要设置的目标文化 var targetCulture = new CultureInfo("zh-CN"); Thread.CurrentThread.CurrentCulture = targetCulture; Thread.CurrentThread.CurrentUICulture = targetCulture; }
你还可以在Razor视图里加两行代码,验证当前文化是否正确:
<p>当前文化:@System.Threading.Thread.CurrentThread.CurrentCulture.Name</p> <p>当前UI文化:@System.Threading.Thread.CurrentThread.CurrentUICulture.Name</p>
如果显示的不是你想要的文化,那问题根源就在文化设置上了。
3. 确认资源类的生成与权限
当你把resx文件的访问修饰符设为public后,VS会自动生成对应的PurchaseOrderModelRes类。你要确认这个类是public的,而且里面有ExpectedDeliveryOn这个属性。要是没生成或者属性缺失,右键resx文件→“运行自定义工具”,让VS重新生成类文件。
另外,ASP.NET Core项目里,要确保资源文件的“生成操作”设置为Embedded resource(右键文件→属性→生成操作),不然编译的时候资源不会被嵌入程序集。
4. 检查视图里的资源调用方式
在Razor视图里,得用Html.DisplayNameFor或者Html.DisplayFor来读取本地化资源,不能直接硬编码或者输出属性名。比如:
@model PurchaseOrderModel <div> <label>@Html.DisplayNameFor(m => m.ExpectedDeliveryOn)</label> <span>@Html.DisplayFor(m => m.ExpectedDeliveryOn)</span> </div>
要是直接写@Model.ExpectedDeliveryOn或者手动写标签文本,肯定加载不了本地化资源。
5. 清理缓存并重新生成项目
有时候旧的缓存会导致资源不更新,试试这几步:
- 右键项目→清理
- 删除项目根目录下的bin和obj文件夹
- 重新生成项目
这样能确保最新的资源文件被正确编译进去。
内容的提问来源于stack exchange,提问作者olivierr91
相关产品推荐
相关产品推荐

