我有链接,例如domain.com/de/controler/action?param=value,我希望make actionlink保持相同的链接只需将de更改为en。如果我试图用ViewContext.RouteData.Values [“id”]获取值;我得到空值。有什么想法吗?
@Html.ActionLink("New Language",
ViewContext.RouteData.GetRequiredString("action"),
ViewContext.RouteData.GetRequiredString("controller"),
new { lang = "en" }
)
答案 0 :(得分:5)
您可以编写自定义网址助手:
public static class UrlExtensions
{
public static string LanguageUrl(this UrlHelper urlHelper, string lang)
{
var rd = urlHelper.RequestContext.RouteData;
var request = urlHelper.RequestContext.HttpContext.Request;
var values = new RouteValueDictionary(rd.Values);
foreach (string key in request.QueryString.Keys)
{
values[key] = request.QueryString[key];
}
values["lang"] = lang;
return urlHelper.RouteUrl(values);
}
}
然后在视图中使用它:
<a href="@Url.LanguageUrl("en")">
<img src="@Url.Content("~/content/flag_en.jpg")" alt="en" />
</a>
你当然可以编写另一个助手来渲染整个锚点,它将使用我们的第一个帮手:
public static class HtmlExtensions
{
public static IHtmlString ChangeLanguage(this HtmlHelper htmlHelper, string lang, string imgUrl)
{
var urlHelper = new UrlHelper(htmlHelper.ViewContext.RequestContext);
var anchor = new TagBuilder("a");
anchor.Attributes["href"] = urlHelper.LanguageUrl(lang);
var img = new TagBuilder("img");
img.Attributes["alt"] = lang;
img.Attributes["src"] = urlHelper.Content(imgUrl);
anchor.InnerHtml = img.ToString(TagRenderMode.SelfClosing);
return new HtmlString(anchor.ToString());
}
}
然后:
@Html.ChangeLanguage("en", "~/content/flag_en.jpg")
现在,如果我们假设您导航到/de/home/index/123?param1=value1¶m2=value2
,则@Html.ChangeLanguage("en", "~/content/flag_en.jpg")
会生成以下标记:
<a href="/en/home/index/123?param1=value1&param2=value2">
<img alt="en" src="/content/flag_en.jpg" />
</a>
答案 1 :(得分:0)
我认为您需要一个控制器操作“ChangeLanguage”才能真正获取引荐来源网址并重定向。
其他选项是,由于ActionLink位于需要“翻译”的视图中,因此您可以对操作和控制器进行硬编码。