C# ASP.NET MVC通过ActionLink生成具有不同区域性参数的url
我在路由中有以下几种url模式:C# ASP.NET MVC通过ActionLink生成具有不同区域性参数的url,c#,asp.net-mvc,routes,C#,Asp.net Mvc,Routes,我在路由中有以下几种url模式: {lang}/package/{packageID} {lang}/package/{packageID}/Edit/{partNumber} ... layout.cshtml中有一个页脚,该页脚为用户提供了不同的文化链接以更改网站的语言。当用户点击链接时,我希望它能改变语言并停留在当前页面,所以我用Razor呈现链接如下: @Html.ActionLink("English", ViewContext.RouteData.Values["Action"],
{lang}/package/{packageID}
{lang}/package/{packageID}/Edit/{partNumber}
...
layout.cshtml中有一个页脚,该页脚为用户提供了不同的文化链接以更改网站的语言。当用户点击链接时,我希望它能改变语言并停留在当前页面,所以我用Razor呈现链接如下:
@Html.ActionLink("English", ViewContext.RouteData.Values["Action"], ViewContext.RouteData.Values["Controller"], new { lang = "en-us"}, null)
@Html.ActionLink("Traditional Chinese", ViewContext.RouteData.Values["Action"], ViewContext.RouteData.Values["Controller"], new { lang = "zh-tw"}, null)
@Html.ActionLink("Japanese", ViewContext.RouteData.Values["Action"], ViewContext.RouteData.Values["Controller"], new { lang = "ja-jp"}, null)
...
但有一个问题是,我需要将上面提到的其他参数相应地传递给页面,以使用户保持在当前页面中
在这种情况下,我如何实现目标
谢谢 您可以使用
返回重定向(HttpContext.Request.urlReferer.ToString())
返回以将用户带回他们所在的页面,而不必担心再次传递参数
流程将是:
@Html.ActionLink(“英语”,ViewContext.RouteData.Values[“Action”],ViewContext.RouteData.Values[“Controller”],new{lang=“en-us”},null)
returnredirect(HttpContext.Request.urlreferer.ToString())将用户带回他们所在的页面代码>来自同一操作方法
您可以使用
返回重定向(HttpContext.Request.urlReferer.ToString())
返回以将用户带回他们所在的页面,而不必担心再次传递参数
流程将是:
@Html.ActionLink(“英语”,ViewContext.RouteData.Values[“Action”],ViewContext.RouteData.Values[“Controller”],new{lang=“en-us”},null)
returnredirect(HttpContext.Request.urlreferer.ToString())将用户带回他们所在的页面代码>来自同一操作方法
您可以创建扩展方法作为创建语言相关链接的帮助器:
public static class LanguageExtensions
{
public static RouteValueDictionary ForLang(this RouteValueDictionary dict, string lang)
{
var cloned = new RouteValueDictionary(dict);
cloned["lang"] = lang;
return cloned;
}
}
现在您可以这样使用它:
@Html.ActionLink("English", ViewContext.RouteData.Values["Action"], ViewContext.RouteData.Values["Controller"], ViewContext.RouteData.ForLang("en-us"), null)
您可以创建扩展方法作为创建语言相关链接的帮助器:
public static class LanguageExtensions
{
public static RouteValueDictionary ForLang(this RouteValueDictionary dict, string lang)
{
var cloned = new RouteValueDictionary(dict);
cloned["lang"] = lang;
return cloned;
}
}
现在您可以这样使用它:
@Html.ActionLink("English", ViewContext.RouteData.Values["Action"], ViewContext.RouteData.Values["Controller"], ViewContext.RouteData.ForLang("en-us"), null)
ASP.NET MVC将路由来自当前请求的段,如果这些段早于您显式提供值的段。如果您可以使您的
{lang}
段成为路线中的最后一段,您想要的将自动发生。@GSerg thnak感谢您的评论,但这似乎不是一个好方法,它实际上在这种情况下会起作用。然而,这将是对url模式的一个约束,每个模式都需要将{lang}放在末尾,并对用户发出请求的顺序进行假设。但这是一个提示,如果我仍然找不到其他解决方案,我会尝试。非常感谢。ASP.NET MVC将路由来自当前请求的段,如果这些段早于您显式提供值的段。如果您可以使您的{lang}
段成为路线中的最后一段,您想要的将自动发生。@GSerg thnak感谢您的评论,但这似乎不是一个好方法,它实际上在这种情况下会起作用。然而,这将是对url模式的一个约束,每个模式都需要将{lang}放在末尾,并对用户发出请求的顺序进行假设。但这是一个提示,如果我仍然找不到其他解决方案,我会尝试。非常感谢。你好,布鲁诺,谢谢你的回答,在发布这个问题之前我已经尝试过这种方法,它很有效。但是我想知道是否有比重定向更好的方法,因为它需要花费更多的时间来做另一个导航。嗨,布鲁诺,谢谢你的回答,我在发布这个问题之前尝试过这种方法,它很有效。但是我想知道是否有一种方法比重定向更好,因为它需要花费更多的时间来进行另一次导航。谢谢,这种方法简单明了,很接近我的需要。谢谢,这种方法简单明了,很接近我的需要。