如何在{controller} / {method}之后获取所有路由值

时间:2011-02-09 08:25:41

标签: c# asp.net-mvc-2 asp.net-mvc-routing

我会渲染按钮以便按以下方式更改语言:

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

这将为我提供如下链接:{...}\en\MyController\MyMethod - 唯一的问题是我丢失了所有路由值,这些值都在方法名称之后。如何添加它们呢?

感谢您的任何提示!

3 个答案:

答案 0 :(得分:2)

我实际上使用了一些方便的扩展方法:

    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"))

答案 1 :(得分:0)

我建议您创建一个新的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") %>

答案 2 :(得分:0)

获取请求参数字符串的简单方法是

var parameters = String.Join("&", Request.QueryString.AllKeys.Select(i => $"{i}={Request.QueryString[i]}"));

它可以在控制器和视图中使用。