.NET 6中ASP.NET Razor如何在Program.cs本地化状态页?
ASP.NET Razor .NET 6 本地化状态页实现方案
问题根源
你之前用CultureInfo.CurrentCulture.Name拼接路径的方法无效,是因为这个属性取的是应用启动线程的默认文化,而非当前请求上下文的动态文化,路径会永远固定为启动时的默认值,无法适配不同请求的本地化需求。
解决方案
1. 调整中间件顺序(关键前提)
确保UseRequestLocalization中间件在状态码页中间件之前执行,这样请求的本地化信息会先被解析,后续才能正确获取:
// 先获取本地化配置并启用请求本地化 var localizationOptions = app.Services.GetRequiredService<IOptions<RequestLocalizationOptions>>().Value; app.UseRequestLocalization(localizationOptions); // 移除重复的UseStatusCodePages调用,避免功能冲突 // app.UseStatusCodePages();
2. 使用动态委托处理状态码重定向
替换原有的UseStatusCodePagesWithReExecute,改用委托版本动态获取当前请求的文化,构造正确的本地化路径:
app.UseStatusCodePages(async context => { var httpContext = context.HttpContext; var statusCode = httpContext.Response.StatusCode; // 从请求特征中获取当前本地化信息 var requestCultureFeature = httpContext.Features.Get<IRequestCultureFeature>(); // 若未获取到文化, fallback 到默认值 var cultureName = requestCultureFeature?.RequestCulture.Culture.Name.ToLowerInvariant() ?? "en-ca"; // 重定向到对应文化的状态页 await httpContext.Response.Redirect($"/{cultureName}/Status{statusCode}"); });
3. 确保状态页路由与本地化资源配置正确
- 状态页路由:在
Status.cshtml顶部配置包含文化参数的路由:@page "{culture}/Status{statusCode:int}" @model YourProject.Pages.StatusModel - 本地化资源文件:在
Resources目录下创建对应文化的资源文件,命名需匹配页面路径:Resources/Pages/Status.en-CA.resx(英文资源)Resources/Pages/Status.fr-CA.resx(法文资源)
额外注意点
- 若你的
RouteDataRequestCultureProvider已正确从路由解析文化,IRequestCultureFeature会自动获取当前请求的文化值,无需额外处理。 - 不要同时使用
UseStatusCodePages和UseStatusCodePagesWithReExecute,两者功能重叠,保留一个即可。
内容的提问来源于stack exchange,提问作者Code Schaden
相关产品推荐
相关产品推荐

