【问题标题】:MVC3 ActionLink change language and keep same parametersMVC3 ActionLink 更改语言并保持相同的参数
【发布时间】:2012-03-21 15:22:29
【问题描述】:

我有例如 domain.com/de/controler/action?param=value 的链接,我想让 actionlink 保持相同的链接,只需将 de 更改为 en。如果我想用 ViewContext.RouteData.Values["id"];我得到空值。有什么想法吗?

@Html.ActionLink("New Language", 
  ViewContext.RouteData.GetRequiredString("action"),  
  ViewContext.RouteData.GetRequiredString("controller"),
  new { lang = "en" }                            
)

【问题讨论】:

    标签: asp.net-mvc-3 html.actionlink


    【解决方案1】:

    您可以编写一个自定义 url 助手:

    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&amp;param2=value2,那么 @Html.ChangeLanguage("en", "~/content/flag_en.jpg") 将生成以下标记:

    <a href="/en/home/index/123?param1=value1&amp;param2=value2">
        <img alt="en" src="/content/flag_en.jpg" />
    </a>
    

    【讨论】:

      【解决方案2】:

      我认为您需要一个控制器操作“ChangeLanguage”才能真正获取引荐来源网址并重定向。

      其他选项是,由于 ActionLink 放置在需要“翻译”的视图中,因此您可以对 Action 和 Controller 进行硬编码。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-30
        • 2015-09-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-28
        相关资源
        最近更新 更多