You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:38:05