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
相关产品推荐
相关产品推荐

