我有一个基于ASP.NET MVC4的Web应用程序,其中我使用包含三个语言标志(图像)的布局。这些标志在整个站点中都可见。现在我想用这些图像进行语言选择。为了显示特定语言的任何页面,我只需要在当前URL中添加一个参数并加载它,然后我的控制器会对其进行评估并在模型中设置正确的语言(或者设置默认的后备语言。请求中没有指定语言。)
这是一个例子(hxxp = http):
未指定语言:
hxxp://mysite.com?StationId=12
指定的语言:
hxxp://mysite.com?StationId=12&lang=1033
我的问题是:如何在布局中形成一个包含语言标记图像的链接,并始终指向当前加载的网址,其中包含所有参数加上新参数&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>
现在,当我运行网站时,起始页面上的链接工作正常,它们指向当前页面并将lang = xy参数添加到相应的URL。
但是当我转到另一个使用相同布局文件但也使用参数的页面时,链接无法正确构建:假设我转到由此URL定义的子页面:
http://localhost:1234/Stations?position=up
页面本身正确显示。但是当我悬停或遵循语言链接时,他们会指出:
http://localhost:1234/Stations?lang=1031
而不是
http://localhost:1234/Stations?position=up&lang=1031
如您所见,省略了任何现有参数。
答案 0 :(得分:8)
您可以使用当前路由值集合,为其添加新值,然后使用url helper RouteUrl
生成url。要收集传递给页面的查询字符串参数,您可以遍历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");
}
然后像这样使用它:
@Url.RouteUrl(currentRouteValues)
答案 1 :(得分:0)
我已经扩展了@Andrei的答案,并创建了一些辅助方法来在视图中构建Url
。
这些是辅助方法:
private static RouteValueDictionary GetKeyValuePairs(this UrlHelper urlHelper)
{
var routeValueDictionary = new RouteValueDictionary(urlHelper.RequestContext.RouteData.Values);
var queryString = HttpContext.Current.Request.QueryString;
foreach (var key in queryString.AllKeys) routeValueDictionary.Add(key, queryString[key]);
return routeValueDictionary;
}
public static string BuildUrl(this UrlHelper urlHelper)
{
var routeValueDictionary = GetKeyValuePairs(urlHelper);
return urlHelper.RouteUrl(routeValueDictionary);
}
public static string BuildUrl(this UrlHelper urlHelper, string key)
{
var routeValueDictionary = GetKeyValuePairs(urlHelper);
if (routeValueDictionary.Keys.Contains(key)) routeValueDictionary.Remove(key);
return urlHelper.RouteUrl(routeValueDictionary);
}
public static string BuildUrl(this UrlHelper urlHelper, string key, object value)
{
var routeValueDictionary = GetKeyValuePairs(urlHelper);
if (routeValueDictionary.ContainsKey(key)) routeValueDictionary[key] = value;
else routeValueDictionary.Add(key, value);
return urlHelper.RouteUrl(routeValueDictionary);
}
然后在我看来,我是这样使用它的:
<a href='@Url.BuilUrl()' >Preserve current query string.</a>
<a href='@Url.BuilUrl("param2", "value")' >Add item to query string.</a>
<a href='@Url.BuilUrl("param1")' >Remove item from query string.</a>
http:// localhost:5000 /?param2 = value2 的结果:
<a href='http://localhost:5000/?param2=value2'>Preserve current query string.</a>
<a href='http://localhost:5000/?param2=value2¶m1=value'>Add item to query string.</a>
<a href='http://localhost:5000/?param1=value' >Remove item from query string.</a>
希望对人们有帮助。