在ActionLink中更改单个路由参数

时间:2012-11-30 02:43:34

标签: c# asp.net-mvc asp.net-mvc-4

我正在尝试实现一个在所有页面上都可见的语言选择器。

我的申请目前有两条路线:

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信息。

如何制作,以便两个链接都包含事件和语言信息(以及将来无法预见的任何其他路由参数),而无需为其明确编程?

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"})