使用Url.Action显示为参数值的类型

时间:2012-02-01 15:50:31

标签: asp.net-mvc dictionary

使用此代码:

var stocks = new Dictionary<string, string>() {{"MSFT", "Microsoft Corporation"}, {"AAPL", "Apple, Inc."}};
<a href="@Url.Action("Test", new {stocks})">Test Item</a>

创建的URL是:

http://localhost:58930/d/m/5b1ab3a0-4bb3-467a-93fe-08eb16e2bb8d/Center/Test?stocks=System.Collections.Generic.Dictionary%602%5BSystem.String%2CSystem.String%5D

显示类型而不是数据。为什么是这样?我如何传递数据?

2 个答案:

答案 0 :(得分:1)

这是因为Dictionary<T, U>不会覆盖ToString()。以这种方式创建的匿名对象,var stocks = new { MSFT = "Microsoft Corporation", AAPL = "Apple, Inc." };,确实如此。当调用ToString()时,匿名对象生成{MSFT = Microsoft Corporation,AAPL = Apple,Inc。}作为其输出,Action分析以创建参数。我相信您还应该能够使用System.Web.Routing.RouteValueDictionary这样创建的RouteValueDictionary stocks = new RouteValueDictionary { { "MSFT ", "Microsoft Corporation" }, { "AAPL", "Apple, Inc." } };

答案 1 :(得分:0)

UrlHelper.Action采用内部转换为RouteValueDictionary的匿名对象:

Url.Action("Test", new { "MSFT" = "Microsoft Corporation", "APPL" = "Apple, Inc." })

或直接RouteValueDictionary

Url.Action("Test", new RouteValueDictionary() {{}})

它匹配动作参数的字典键。如果匹配,则将值添加到查询字符串(或路径路径,具体取决于Url路由规则)。

因此,如果您的操作没有名为MSFT或APPL的参数,则路由将不起作用。您需要serialize the dictionary(或以字符串形式传递数据的任何其他方式)并将其作为编码字符串(HttpServerUtility.UrlEncode)传递给UrlHelper

Url.Action("Test", new { "stocks", serializedDictionary });

然后在操作中,您将不得不从序列化字典中再次提取数据。