如何修改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
相关产品推荐
相关产品推荐

