Как получить все значения маршрута после {controller} / {method} - PullRequest
2 голосов
/ 09 февраля 2011

Я отображаю кнопки, чтобы изменить язык следующим образом:

                    <%: Html.ActionLink(
                        "EN", 
                        ViewContext.RouteData.Values["action"].ToString(), 
                        new { lang = "en" }, new { @class="tab" })%>

Это даст мне следующую ссылку: {...}\en\MyController\MyMethod - осталась только одна проблема - я потерял все значения маршрутизации, которые следуют после имени метода. Как их можно добавить?

Спасибо за любые советы!

Ответы [ 2 ]

2 голосов
/ 09 февраля 2011

Я на самом деле использую несколько удобных методов расширения:

    public static RouteValueDictionary ToRouteValueDictionary(this NameValueCollection collection)
    {
        RouteValueDictionary dic = new RouteValueDictionary();
        foreach (string key in collection.Keys)
            dic.Add(key, collection[key]);

        return dic;
    }

    public static RouteValueDictionary AddOrUpdate(this RouteValueDictionary dictionary, string key, object value)
    {
        dictionary[key] = value;
        return dictionary;
    }

    public static RouteValueDictionary RemoveKeys(this RouteValueDictionary dictionary, params string[] keys)
    {
        foreach (string key in keys)
            dictionary.Remove(key);

        return dictionary;
    }

Это позволяет мне сделать следующее:

//Update the current routevalues and pass it as the values.
@Html.ActionLink("EN", ViewContext.RouteData.Values["action"], ViewContext.RouteData.Values.AddOrUpdate("lang", "en"))

//Grab the querystring, update a value, and set it as routevalues.
@Html.ActionLink("EN", ViewContext.RouteData.Values["action"], Request.QueryString.ToRouteValueDictionary.AddOrUpdate("lang", "en"))
0 голосов
/ 09 февраля 2011

Я бы посоветовал вам создать новый помощник HTML для выполнения этой работы, поскольку в представлении нет аккуратного способа делать то, что вы хотите. Это может выглядеть примерно так:

public static class MyHtmlHelpers {
  public static MvcHtmlString ChangeLanguageLink(this HtmlHelper html, string label, string newLang) {
    html.ViewContext.RouteData.Values["lang"] = newLang;
    return html.ActionLink(label, html.ViewContext.RouteData.Values["action"], ViewContext.RouteData.Values);
  }
}

И вот как вы бы использовали это в представлении:

<%: Html.ChangeLanguageLink("EN", "en") %>
...