我正在尝试实现一个在所有页面上都可见的语言选择器。
我的申请目前有两条路线:
routes.MapRoute(
name: "EventDriven",
url: "{language}/{eventid}/{controller}/{action}/{id}",
defaults: new { language = "en", controller = "Home", action = "Index", id = UrlParameter.Optional }
);
routes.MapRoute(
name: "Default",
url: "{language}/{controller}/{action}/{id}",
defaults: new { language = "en", controller = "Home", action = "Index", id = UrlParameter.Optional }
);
在我的共享_layout.cshtml
文件中,我有以下操作链接:
@Html.ActionLink("English", ViewContext.RouteData.Values["action"].ToString(), new {language="en"})
@Html.ActionLink("Français", ViewContext.RouteData.Values["action"].ToString(), new {language="fr"})
我遇到的问题是我希望保留{eventid}
路段,但它并不适用于每个网址。
在主页索引页http://localhost/MySite/
上,两个操作链接如下:
English: http://localhost/MySite/
French: http://localhost/MySite/fr
哪个好,但在我的内页http://localhost/MySite/en/2/Donation
上,操作链接是:
English: http://localhost/MySite/en/2/Donation
French: http://localhost/MySite/fr/Donation
如果我转到http://localhost/MySite/fr/2/Donation
,则操作链接为:
English: http://localhost/MySite/en/Donation
French: http://localhost/MySite/fr/2/Donation
问题是更改语言操作链接不包含eventid 2
信息。
如何制作,以便两个链接都包含事件和语言信息(以及将来无法预见的任何其他路由参数),而无需为其明确编程?
答案 0 :(得分:2)
您最终可能使用的是Html.RouteLink()
在这种情况下,我会这样称呼它(如果需要多种语言,则更改为数组):
@{
var enRoute = new RouteValueDictionary(ViewContext.RouteData.Values);
enRoute["language"] = "en";
....
}
(记住新的RouteValueDictionary(),你不想覆盖现有的那个)
然后:
@Html.RouteLink("English", enRoute)
这有点讨厌,如果不使用视图变量(我不喜欢)你就无法绕过它,但是你得到了链接的整个路径。
答案 1 :(得分:0)
使用此方法的内联方式:
@Html.ActionLink("English", this.ViewContext.RouteData.Values["controller"].ToString(), new RouteValueDictionary(ViewContext.RouteData.Values) {["language"] = "en"})