2010-03-13 67 views
3

全部,通過DictionaryValues字典到ActionLink

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

從我可以告訴,這個匿名對象實際上是通過反射轉換成字典反正但你不能傳遞一個dictio中首先是它!

爲鏈接生成的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 paramater的解決方案產生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> 

即它使用反射和完全錯誤的工作的事情了......

回答

1

RouteValueDictionary的系統。 Web.Routing,實際上,是的,這個類有一個構造函數,它需要一個對象,或者一個IDictionary,但有一個重載需要這個,所以你可以傳遞一個RouteValueDictionary來代替

編輯:我認爲問題是使用此零件:

new Dictionary<string,object>()) 

最後;它應該是空的。因爲,它會做的是提取字典的公共屬性並被錯誤地使用。讓我知道如果更改爲null可以修復此問題。

+0

嗨,謝謝,但這也行不通。 用一些更多信息更新了原件 – Graham 2010-03-13 22:17:21

+0

什麼是menu.Attributes?它拉動字典的屬性並將其用作路由參數,這就是爲什麼你會得到這個錯誤。 – 2010-03-15 00:33:20

+0

menu.Attributes本身是一個IDictionary 。我明白,它使用反射來訪問字典的屬性並使其錯誤。 我不明白爲什麼我上面提出的修改,即。正如你所建議的那樣,從字典中創建一個路由值仍然會導致反射位不正確,因爲我將它傳遞給了一個Routevaluedictionary – Graham 2010-03-15 11:29:49

0

太空牛..我已經失去了原來的ID我用來發布這個,所以不能直接回答你的問題。

這是ASP.NET MVC 1.0。

雖然有一個似乎需要dictonary的重載,但生成的HTML並不是字典的內容,而是字典本身的反映類型,基本上沒有達到我期望的水平。在MVC框架中,我沒有辦法讓它接受預定義的鍵/值列表(例如在字典中)並正確地生成HTML href。我創建一個匿名對象,這是我的情況下不可能的。

1

格雷厄姆,

menu.Attributes是一個IDictionary <串,串>和方法預期的IDictionary <串,對象 >正確?將您的鍵和值複製到其值爲類型對象的另一個字典中。

+0

這就是答案。這也是創建RouteValueDictionary時的答案 - 構造函數不會正確處理除Dictionary 以外的任何內容。 – 2015-12-08 22:02:26

3

關於如何解決在MVC3中爲我工作的建議。用法示例:

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

routeValues.Add("EmployeeID", 1); 

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