使用此代码:
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
显示类型而不是数据。为什么是这样?我如何传递数据?
答案 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 });
然后在操作中,您将不得不从序列化字典中再次提取数据。