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

如何修改ASP.NET Core中{controller}前的路由模式以支持多语言

ASP.NET Core 多语言URL路由配置解决方案

你遇到的问题是因为重复定义了同名路由,且未正确兼容无语言参数的URL请求。当你访问/Test1/HelloAct时,路由系统会把Test1识别为lang参数,导致找不到对应的控制器,从而返回404。以下是正确的配置方案:

正确的路由配置

需要定义两个不同名称的路由规则,分别处理带语言前缀和不带语言前缀的请求:

// 1. 带语言参数的路由(默认值为en-us)
app.MapControllerRoute(
    name: "Localized",
    pattern: "{lang=en-us}/{controller=Home}/{action=Index}/{id?}");

// 2. 兼容无语言参数的URL,自动映射到默认语言en-us
app.MapControllerRoute(
    name: "Default",
    pattern: "{controller=Home}/{action=Index}/{id?}",
    defaults: new { lang = "en-us" });

配置说明

  • 第一个路由Localized:处理带语言前缀的URL,比如/en-us/Test1/HelloAct、/ja-jp/Test1/HelloAct,当省略lang参数时(直接访问/Home/Index),会自动使用默认值en-us。
  • 第二个路由Default:处理无语言前缀的URL(如/Test1/HelloAct),通过defaults显式指定lang参数的默认值为en-us,确保请求能正确匹配到目标控制器的Action。

获取语言参数

在控制器Action中,可以直接接收lang参数:

public class Test1Controller : Controller
{
    public string HelloAct(string lang)
    {
        return $"Hello World. 当前语言: {lang}";
    }
}

或者通过RouteData获取:

public string HelloAct()
{
    var lang = RouteData.Values["lang"]?.ToString() ?? "en-us";
    return $"Hello World. 当前语言: {lang}";
}

可选:语言参数约束

如果需要限制仅允许指定的语言代码(比如en-us、ja-jp、ko-kr),可以添加路由正则约束:

app.MapControllerRoute(
    name: "Localized",
    pattern: "{lang:regex(en-us|ja-jp|ko-kr)=en-us}/{controller=Home}/{action=Index}/{id?}");

这样当访问不符合规则的语言前缀(如/fr-fr/Test1/HelloAct)时,会返回404,避免无效的语言参数请求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 23:51:37