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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 03:15:38