【问题标题】:How to get all route-values after {controller}/{method}如何在 {controller}/{method} 之后获取所有路由值
【发布时间】:2011-02-09 08:25:40
【问题描述】:

我会渲染按钮以更改语言如下:

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

这将使我的链接如下:{...}\en\MyController\MyMethod - 剩下的唯一问题是我丢失了所有路由值,这些值跟在方法名称之后。怎么可能也添加它们?

感谢您的任何提示!

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢 - 扩展的好主意。扩展这个概念我还是不太习惯,但是对于这样的需求来说确实是一件好事。
    • 扩展方法非常强大,是 MVC 和 Linq 工作的核心部分。在这里,我复制了 jQuery 的想法,启用了链接。
    【解决方案2】:

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

    【讨论】:

    • 很好的输入 - 我想到了类似的东西,但感觉没有它一定是可能的。谢谢。
    【解决方案3】:

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

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

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

    【讨论】:

    • 请补充一点说明。
    猜你喜欢
    • 2014-01-22
    • 1970-01-01
    • 2021-10-14
    • 2019-12-22
    • 2015-04-07
    • 2015-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多