C# 将querystring值映射为路由中的控制器

C# 将querystring值映射为路由中的控制器,c#,asp.net,asp.net-mvc,C#,Asp.net,Asp.net Mvc,我的网站在首页以30多种语言显示用户提交的内容,我目前使用的路径如下: http://www.example.com?lang=en 或者如果不是第一页 http://www.example.com?lang=en&page=2 但这对用户和搜索引擎优化都不友好。 mvc中有没有一种方法可以将这些值路由到 http://www.example.com/en 及 不在中间添加新操作,如本例中的lang: http://www.example.com/lang/en/2 更新。

我的网站在首页以30多种语言显示用户提交的内容,我目前使用的路径如下:

http://www.example.com?lang=en 
或者如果不是第一页

 http://www.example.com?lang=en&page=2
但这对用户和搜索引擎优化都不友好。 mvc中有没有一种方法可以将这些值路由到

 http://www.example.com/en 

不在中间添加新操作,如本例中的
lang

http://www.example.com/lang/en/2

更新。以下是我从Alexeis的回答中得出的结论,以防任何人需要同样的东西:

如果只是语言:

 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+"});
它不应该捕获任何其他路径,除非您的操作只有两个字母。

您不需要“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)
显然,可以更改返回类型和操作名称

public ActionResult English(int page)