【问题标题】:How to dynamically create routes in a HTML actionlink如何在 HTML 动作中动态创建路由link
【发布时间】:2011-01-16 15:35:11
【问题描述】:

我正在尝试将路由值发送到一个方法,但我似乎无法弄清楚这一点。这是我的代码

<%  string s = "cool";
    object d = new {  s = "1" };

         %>
<%= Html.ActionLink("Home", "Index", d, "ql")%>

下面的代码会生成一个这样的 url

http://localhost:49450/?s=1

网址应该是这样的

http://localhost:49450/?cool=1

我错过了什么

【问题讨论】:

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


    【解决方案1】:

    因为在 'new { ... }' 表达式的上下文中,'s' 不对应于它可能首先出现的变量 - 它定义了创建的匿名类的成员的名称。

    当你说:

    新 { S = 123 }

    您实际上是在生成一个匿名类(您永远看不到该类的名称)。类的每个成员的类型由您分配给它的任何内容隐式确定。在上面的示例中,生成了一个类似这样的类

    class AnonymousClass_S483Ks4 {
     public int S {get;set;}
    }
    

    有两种方法可以做你想做的事:

    1) 你不得不说:

    new { cool = 123 } 
    

    2) 现在我假设您希望名称是动态的,因此您需要使用 RouteValueDictionary 它允许您放入键值对。

            // RouteValueDictionary is IDictionary<string, object>
            var dictionary = new RouteValueDictionary();  
            string s = "cool";
            dictionary.Add(s, 123);
            htmlHelper.ActionLink("Home", "Index", dictionary);
    

    如您所见,在这里您可以使用变量“s”来表示您想要的任何内容。这应该为您提供所需的 URL。

    【讨论】:

    • OK..我已经尝试了代码,但它生成了一个像这样的链接localhost:49450/…
    • @luke101 根据您的原始代码,您是否可能在执行“object dictionary = new RouteValueDictionary()”,您需要确保传递给 ActionLink() 的对象是 RouteValueDictionary 类型
    • 哦,是的..我逐字复制代码并尝试了它。但它给出了上面的网址
    • 我运行它(我以前没有)并得到“Home”,这就是你寻找。我肯定遇到过您之前遇到的问题,它是由调用错误的重载(传入“对象”)引起的。检查编译器正在使用哪个重载,并确保您使用的是带有 RouteValueDictionary 的重载。我正在使用 MVC2,但我认为这个签名没有改变。
    • 哦哦哦... M$ rulezz... 他们使用object htmlAttributes 超载,直到我手动将其转换为(IDictionary&lt;string, object&gt;)null,现在它可以工作了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-09
    • 1970-01-01
    • 1970-01-01
    • 2014-07-08
    • 1970-01-01
    • 2022-11-12
    相关资源
    最近更新 更多