C# 将querystring值映射为路由中的控制器
我的网站在首页以30多种语言显示用户提交的内容,我目前使用的路径如下: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 更新。
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)