如何在视图中将参数添加到当前URL?

Rob*_*ert 3 c# hyperlink routevalues razor asp.net-mvc-4

我有一个基于ASP.NET MVC4的Web应用程序,其中我使用包含三个语言标志(图像)的布局.这些标志在整个站点中都可见.现在我想用这些图像进行语言选择.为了显示特定语言的任何页面,我只需要在当前URL中添加一个参数并加载它,然后我的控制器对其进行评估并在模型中设置正确的语言(或者设置默认的后备语言.没有在请求中指定的语言).

这是一个例子(hxxp = http):

没有指定语言:

http://example.com?StationId=12
Run Code Online (Sandbox Code Playgroud)

指定语言:

http://example.com?StationId=12&lang=1033
Run Code Online (Sandbox Code Playgroud)

我的问题是:我如何在我的布局中形成一个环绕语言标志图像的链接,并始终指向当前加载的URL,所有参数&lang=1033分别加上一个新参数?lang=1033,以防只有语言参数?

换句话说:如何使用所有参数创建指向同一页面的链接,并简单地将路由值添加到URL?

更新:这是一个详细的例子

在我的_Layout.cshtml身上:

@{
var u_eng = new RouteValueDictionary(Url.RequestContext.RouteData.Values);
var u_deu = new RouteValueDictionary(Url.RequestContext.RouteData.Values);
var u_por = new RouteValueDictionary(Url.RequestContext.RouteData.Values);
u_eng.Add("lang", "1033");
u_deu.Add("lang", "1031");
u_por.Add("lang", "1046");
}
.
.
.
<li>
    <a href="@Url.RouteUrl(u_por)" class="Flag BR">BR</a>
</li>
<li>
    <a href="@Url.RouteUrl(u_eng)" class="Flag US">US</a>
</li>
<li>
    <a href="@Url.RouteUrl(u_deu)" class="Flag DE">DE</a>
</li>
Run Code Online (Sandbox Code Playgroud)

现在,当我运行网站时,起始页面上的链接工作正常,它们指向当前页面并将lang = xy参数添加到相应的URL.

但是,当我转到使用相同布局文件并使用参数的另一个页面时,链接无法正确构建:假设我转到此URL定义的子页面:

http://localhost:1234/Stations?position=up
Run Code Online (Sandbox Code Playgroud)

页面本身正确显示.但当我悬停或遵循语言链接时,他们指出:

http://localhost:1234/Stations?lang=1031 代替

http://localhost:1234/Stations?position=up&lang=1031

如您所见,省略了任何现有参数.

And*_*rei 8

您可以使用当前路由值集合,向其添加新值,然后使用url helper生成url RouteUrl.要收集传递给页面的查询字符串参数,您可以遍历HttpContext.Request.QueryString字典:

@{
    var currentRouteValues = new RouteValueDictionary(Url.RequestContext.RouteData.Values);
    var queryString = Request.QueryString;
    foreach (var key in queryString.AllKeys)
    {
        currentRouteValues.Add(key, queryString[key]);
    }

    currentRouteValues.Add("lang", "1033"); 
}
Run Code Online (Sandbox Code Playgroud)

然后像这样使用它:

@Url.RouteUrl(currentRouteValues)
Run Code Online (Sandbox Code Playgroud)