将查询字符串值映射为路由中的控制器
本文关键字:路由 控制器 映射 查询 字符串 | 更新日期: 2023-09-27 18:31:57
我的网站在首页显示用户提交的30+种语言的内容,我目前正在使用以下路径:
http://www.example.com?lang=en
或者如果它不是第一页
http://www.example.com?lang=en&page=2
但这真的对用户或 SEO 不友好。mvc 中有没有办法将这些值路由到类似
http://www.example.com/en
和
http://www.example.com/en/2
无需像本例中那样在中间添加新操作lang
:
http://www.example.com/lang/en/2
更新。这是我从阿列克谢斯的回答中得出的,以防有人需要同样的东西:
在语言的情况下:
routes.MapRoute("MyLang", "{lang}", new { controller = "Home", action = "Index" },new { lang = @"'D{2}"});
如果您需要语言和可选的页面:
routes.MapRoute("MyLang", "{lang}/{page}", new { controller = "Home", action = "Index", page = UrlParameter.Optional }, new { lang = @"'D{2}", page = @"'d+"});
它不应该捕获任何其他路径,除非您的操作只有 2 个字母。
路由
不需要"lang/"来匹配区域性。简单的"{lang}"就可以了,只要你以某种方式对路线进行排序,以便其他路线正确匹配。您还可以考虑对路由参数进行约束,以限制冲突的数量。
routes.MapRoute("MyLang", "{lang}",
new { controller = "Home", action = "Home", }
class HomeController{
public ActionResult Home(string lang)
{
return View();
}
}
你可以像这样添加一个新路由
routes.MapRoute("MyLang", "{action}/{page}",
new { controller = "ControllerName",page=0 }
这样,lang 名称将自动映射到操作,并且页面将作为参数传递,前提是您将操作签名为
public ActionResult English(int page)
可以更改返回类型和操作名称