要在MVC Razor应用程序中实现语言选择,我在路由映射中使用前导路径段,如www.mydomain.com/lang/controller/action/id?param=
,其中lang
是2个字母的ISO国家/地区代码,如fr,de,it,en等
我使用以下路由映射(工作正常):
// Special localisation route mapping - expects specific language/culture code as first param
routes.MapRoute(
name: "Localisation",
url: "{lang}/{controller}/{action}/{id}",
defaults: new { lang = "en", controller = "Home", action = "Index", id = UrlParameter.Optional },
constraints: new { lang = @"[a-z]{2}|[a-z]{2}-[a-zA-Z]{2}" }
);
之前我在母版页中生成了我的语言选择链接,因此它们只是当前网址的变体(仅更改了第一个细分)。现在我需要能够在局部视图中创建链接,可以通过Ajax动态加载,菜单项(国家)是数据驱动的。
这意味着我需要使用引用URL(实际加载的页面)并修改它以为每种可用语言插入新语言。菜单项都是数据库驱动的,因此只包含2个字母的语言代码和显示名称。
Google搜索"如何将网址分隔为控制器和操作" 我在此处找到了一个有趣的链接:http://average-joe.info/url-to-route-data/
根据该链接,这是我尝试的内容,但它会在http://localhost:51176/
之类的根网址或http://localhost:51176/en/home/index
之类的完整网址上爆炸。我原以为它会返回默认值home
(控制器)和index
(操作)。相反,我得到一个Null引用异常。
string path = Request.UrlReferrer.ToString();
string queryString = ""; // Blank for now
System.Web.Routing.RouteData routeFromUrl = System.Web.Routing.RouteTable.Routes.GetRouteData(new HttpContextWrapper(new HttpContext(new HttpRequest(null, new UriBuilder(Request.Url.Scheme, Request.Url.Host, Request.Url.Port, path).ToString(), queryString), new HttpResponse(new System.IO.StringWriter()))));
// Blows up with Null exception as routeFromUrl is always null
string controller = (string)routeFromUrl.Values["controller"];
string action = (string)routeFromUrl.Values["action"];
string id = (string)routeFromUrl.Values["id"];
然后,我可以使用引用控制器,操作和参数生成具有这些href值的链接,因此保持在同一页面上#34; (除了明显的语言变化):
http://localhost:51176/en/home/index
http://localhost:51176/de/home/index
http://localhost:51176/fr/home/index
我使用这段代码的方式出了什么问题(或者它是不是按照我的预期工作)?
答案 0 :(得分:1)
Do'h ......这么简单。
只需提供URL 的路径部分,因为它使用当前的方案,主机&应用于该路径的端口。
string path = Request.UrlReferrer.AbsolutePath;
如果您按照我的说明进行链接,就像我一样,您需要调整以下内容才能使用ToString()
,因为它们在空时不会转换为字符串:
string controller = routeFromUrl.Values["controller"].ToString();
string action = routeFromUrl.Values["action"].ToString();
string id = routeFromUrl.Values["id"].ToString();
这将按预期提供controller="home"
,action="index"
和id=""
!呼