将查询字符串值映射为路由中的控制器

本文关键字:路由 控制器 映射 查询 字符串 | 更新日期: 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)

可以更改返回类型和操作名称