将routeValues的Dictionary传递给ActionLink

时间:2010-03-13 19:28:33

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

所有

掌握ASP.NET MVC。到目前为止,这么好,但这个有点疯了。

我有一个视图模型,其中包含超链接的属性字典,如下所示:

menu =模型变量

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>

即。它使用反射和工作完全错误...

5 个答案:

答案 0 :(得分:5)

关于如何修复的建议在MVC3中为我工作。用法示例:

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

routeValues.Add("EmployeeID", 1);

@Html.ActionLink("Employee Details", "EmployeeDetails", "Employee", new RouteValueDictionary(routeValues), null);

答案 1 :(得分:2)

格雷厄姆,

menu.Attributes是一个IDictionary&lt; string,string&gt;并且该方法需要IDictionary&lt; string, object &gt;对?将键和值复制到另一个值为object的字典中。

答案 2 :(得分:1)

RouteValueDictionary中的{p> System.Web.Routing,实际上,是的。此类有一个构造函数,它接受一个对象或IDictionary<string, object>。有一个重载需要这个。因此,您可以传递RouteValueDictionary

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

new Dictionary<string,object>()) 
最后;它应该为null。因为,它将会提取字典的公共属性并被错误地使用。如果更改为null可以解决问题,请告诉我。

答案 3 :(得分:0)

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

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

也许我不明白你的问题。

答案 4 :(得分:0)

太空牛..我已经丢失了我以前发布的原始身份证,因此无法直接回答您的问题。

这是ASP.NET MVC 1.0。

虽然有一个过载似乎需要一个dictonary,但生成的HTML不是字典的内容,而是字典本身的反映类型,基本上没有做我期望的。在MVC框架中我无法接受预定义的键/值列表(例如在字典中)并且可以正确地生成HTML href。我来创建一个匿名对象,这在我的场景中是不可能的。