8

全部,

掌握 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>

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

4

5 回答 5

7

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

IDictionary<string, object> routeValues = new Dictionary<string, object>();

routeValues.Add("EmployeeID", 1);

@Html.ActionLink("Employee Details", "EmployeeDetails", "Employee", new RouteValueDictionary(routeValues), null);
于 2012-03-01T23:29:32.130 回答
3

格雷厄姆,

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

于 2010-06-28T18:12:54.037 回答
1

RouteValueDictionary实际上System.Web.Routing,是的。这个类有一个构造函数,它接受一个对象,或者一个IDictionary<string, object>. 有一个重载需要这个。所以你可以通过 aRouteValueDictionary代替。

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

new Dictionary<string,object>()) 

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

于 2010-03-13T20:53:03.317 回答
0

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

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

也许我不明白你的问题。

于 2010-06-16T20:18:10.997 回答
0

太空牛..我丢失了我用来发布此内容的原始 ID,因此无法直接回答您的问题。

这是使用 ASP.NET MVC 1.0。

尽管出现了一个似乎需要字典的重载,但生成的 HTML 不是字典的内容,而是字典本身的反射类型,基本上没有达到我的预期。在 MVC 框架中,我无法让它接受预定义的键/值列表(例如在字典中)并让它正确生成 HTML href。我必须创建一个匿名对象,这在我的场景中是不可能的。

于 2010-06-18T22:17:05.193 回答