MVC3 ActionLink меняет язык и сохраняет те же параметры - PullRequest
0 голосов
/ 21 марта 2012

У меня есть ссылка, например, 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" }                            
)

Ответы [ 2 ]

5 голосов
/ 21 марта 2012

Вы можете написать собственный помощник по 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&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>
0 голосов
/ 21 марта 2012

Я думаю, что вам нужно действие контроллера "ChangeLanguage", чтобы фактически получить URL-адрес реферера и перенаправление.

Другой вариант заключается в том, что поскольку ActionLink помещен в представление, которое необходимо "перевести", вы можете жестко закодировать действие и контроллер.

...