ASP.NET MVC多语言路由配置问题:带lang前缀路由返回404如何解决
问题根源
- ASP.NET 路由系统是按注册顺序从上到下匹配的,匹配到符合规则的路由就会停止后续匹配
- 你把不带语言前缀的
Default路由放在了第一位,当访问/en/home/products时,系统会把路径分段直接套入{controller}/{action}/{id}的规则:- 把
en识别为controller参数值 - 把
home识别为action参数值 - 把
products识别为id参数值
- 把
- 你的项目里不存在名为
en的控制器,自然就返回404错误
修复方案
- 调整两条路由的注册顺序,把带语言前缀的
Default2路由放在前面 - 给
lang参数添加正则约束,避免不带语言前缀的路径被这条路由错误匹配(比如你支持的语言是en和zh,就限制lang只能是这两个值) - 调整后的路由代码如下:
routes.MapRoute( name: "Default2", url: "{lang}/{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }, constraints: new { lang = "en|zh" } // 替换为你实际支持的语言编码 ); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { lang = "en", controller = "Home", action = "Index", id = UrlParameter.Optional } );
- 调整后访问
/en/home/products会优先匹配第一条路由,正确识别lang=en、controller=home、action=products - 访问不带语言前缀的路径会走到第二条路由,自动使用默认的
lang=en,符合你的需求
内容的提问来源于stack exchange,提问作者Diego
相关产品推荐
相关产品推荐

