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

Razor Pages本地化无法找到SharedResource,需调整实现方式吗?

解决Razor Pages中SharedResource本地化找不到的问题

没错,Razor Pages的本地化实现和传统Razor Views确实有细微差异,尤其是SharedResource的引用逻辑,你需要调整配置和资源结构来适配。结合你提供的Startup代码,我来一步步帮你修正:

1. 调整Startup.cs的服务配置

你当前用的AddMvc()是针对MVC控制器+视图的配置,Razor Pages更推荐使用AddRazorPages()来做精准配置,这样能确保本地化服务正确绑定到Razor Pages环境。修改后的ConfigureServices方法如下:

public void ConfigureServices(IServiceCollection services)
{
    services.AddLocalization(o => { o.ResourcesPath = "Resources"; });

    services.AddRazorPages()
        .AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix, options => options.ResourcesPath = "Resources")
        .AddDataAnnotationsLocalization(options =>
        {
            // 如果你需要用SharedResource处理数据注解的本地化,添加这个配置
            options.DataAnnotationLocalizerProvider = (type, factory) =>
                factory.Create(typeof(SharedResource));
        });
}

2. 确保SharedResource的结构正确

要让本地化器找到SharedResource,你需要:

  • 在项目根目录(或与Resources文件夹匹配的命名空间下)创建一个空的SharedResource类,作为资源的标记类型:
    public class SharedResource
    {
        // 无需添加任何代码,仅作为本地化器的类型标记
    }
    
  • 在Resources文件夹下创建对应的资源文件:
    • 默认资源:SharedResource.resx
    • 语言特定资源:比如SharedResource.zh-CN.resx、SharedResource.en-US.resx等
  • 检查资源文件的属性:确保自定义工具设置为PublicResXFileCodeGenerator,这样生成的资源类是public访问级别,本地化器才能正常访问。

3. 在Razor Pages中正确引用SharedResource

在你的.cshtml页面中,通过注入IStringLocalizer<SharedResource>来使用共享资源,而不是依赖页面自身的资源:

@inject IStringLocalizer<SharedResource> SharedLocalizer

<h1>@SharedLocalizer["WelcomeMessage"]</h1>
<p>@SharedLocalizer["DescriptionText"]</p>

4. 验证中间件配置

最后确保Configure方法中启用了本地化中间件,并且放在路由之前:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    // 其他中间件...

    var supportedCultures = new[]
    {
        new CultureInfo("en-US"),
        new CultureInfo("zh-CN")
    };
    app.UseRequestLocalization(new RequestLocalizationOptions
    {
        DefaultRequestCulture = new RequestCulture("en-US"),
        SupportedCultures = supportedCultures,
        SupportedUICultures = supportedCultures
    });

    app.UseRouting();

    // 其他中间件...
    app.UseEndpoints(endpoints =>
    {
        endpoints.MapRazorPages();
    });
}

这样调整后,你的SharedResource就能在Razor Pages环境下正常被识别和使用了。

内容的提问来源于stack exchange,提问作者SteinTech

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:38:17