【问题标题】:Pass Dictionary of routeValues to ActionLink将 routeValues 字典传递给 ActionLink
【发布时间】:2010-03-13 19:28:32
【问题描述】:

全部,

掌握 ASP.NET MVC。到目前为止,一切都很好,但是这个有点疯狂。

我有一个包含超链接属性字典的视图模型,使用如下:

菜单 = 模型变量

Html.ActionLink(Html.Encode(menu.Name), Html.Encode(menu.Action), Html.Encode(menu.Controller), menu.Attributes, null)

问题是“menu.Attributes”的位置需要表单中的对象:

new  { Name = "Fred", Age=24 }

据我所知,这个匿名对象实际上是通过反射转换为字典但是你不能首先将字典传递给它!!!

为链接生成的 Html 仅显示字典类型。

我到底该如何解决这个问题?重点是它的通用性和控制器可以在之前设置 menu.Attributes....

根据下面的帖子,我尝试了以下方法:

Html.ActionLink(Html.Encode(menu.Name), Html.Encode(menu.Action), Html.Encode(menu.Controller), new RouteValueDictionary(menu.Attributes), new Dictionary<string,object>())

但这仍然不起作用(我猜代码内部调用了获取对象的通用方法?)。以上(以及我将字典传递给第 4 个参数的原始解决方案会产生类似于以下内容的 HTML:

<a href="/EditRole?Comparer=System.Collections.Generic.GenericEqualityComparer%601%5BSystem.String%5D&amp;Count=1&amp;Keys=System.Collections.Generic.Dictionary%602%2BKeyCollection%5BSystem.String%2CSystem.String%5D&amp;Values=System.Collections.Generic.Dictionary%602%2BValueCollection%5BSystem.String%2CSystem.String%5D">EditDocumentRoles</a>

即它使用反射并且完全错误地解决问题......

【问题讨论】:

    标签: asp.net asp.net-mvc actionlink routevalues


    【解决方案1】:

    关于如何修复的建议在 MVC3 中对我有用。示例用法:

    IDictionary<string, object> routeValues = new Dictionary<string, object>();
    
    routeValues.Add("EmployeeID", 1);
    
    @Html.ActionLink("Employee Details", "EmployeeDetails", "Employee", new RouteValueDictionary(routeValues), null);
    

    【讨论】:

      【解决方案2】:

      格雷厄姆,

      menu.Attributes 是一个 IDictionary 并且该方法需要 IDictionaryobject> 对吗?将您的键和值复制到另一个字典中,其中的值是对象类型。

      【讨论】:

      • 这就是答案。这也是创建 RouteValueDictionary 时的答案 - 构造函数不会正确处理 Dictionary 之外的任何内容。
      【解决方案3】:

      RouteValueDictionarySystem.Web.Routing 中,实际上,是的。这个类有一个构造函数,它接受一个对象,或者一个IDictionary&lt;string, object&gt;。有一个重载需要这个。因此,您可以改为传递 RouteValueDictionary

      编辑:我认为问题出在这部分:

      new Dictionary<string,object>()) 
      

      最后;它应该为空。因为,它将做的是提取字典的公共属性并被错误地使用。让我知道更改为 null 是否可以解决问题。

      【讨论】:

      • 您好,谢谢,但这也不起作用。用更多信息更新了原版
      • 什么是 menu.Attributes?它正在提取字典的属性并将其用作路由参数,这就是您收到该错误的原因。
      • menu.Attributes 本身就是一个 IDictionary。我知道这是使用反射来访问字典的属性并弄错了。我不明白为什么我在上面所做的修改,即。正如您所建议的那样,从字典中创建一个路由值仍然会导致反射位不正确,因为我正在向它传递一个路由值字典
      • 我同意......这得到了支持:msdn.microsoft.com/en-us/library/cc680124.aspx.
      • 编辑了帖子;我认为您需要传递 null 而不是您创建的最后一个字典 作为新...
      【解决方案4】:

      我正在使用 MVC 2,我看到不止一个 Html.ActionLink 方法将 IDictionary 作为 Html 属性的参数。有什么原因你不能使用其中之一吗?如果您确实需要具有一些默认值的该方法的较短形式,那么您可以在 HtmlHelper 上编写适配器扩展方法。

      http://msdn.microsoft.com/en-us/library/system.web.mvc.html.linkextensions.actionlink(VS.90).aspx

      也许我不明白你的问题。

      【讨论】:

        【解决方案5】:

        Space Cow.. 我丢失了发布此内容的原始 ID,因此无法直接回答您的问题。

        这是在 ASP.NET MVC 1.0 中使用的。

        虽然有一个看起来像字典的重载,但生成的 HTML 不是字典的内容,而是字典本身的反射类型,基本上没有达到我的预期。在 MVC 框架中,我无法让它接受预定义的键/值列表(例如在字典中)并让它正确生成 HTML href。我不得不创建一个匿名对象,这在我的场景中是不可能的。

        【讨论】:

          猜你喜欢
          • 2018-02-28
          • 1970-01-01
          • 1970-01-01
          • 2012-12-10
          • 1970-01-01
          • 1970-01-01
          • 2015-02-16
          • 2020-02-06
          • 1970-01-01
          相关资源
          最近更新 更多