2012-02-01 91 views
0

有了这个代码:
类型显示为参数值与Url.Action

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 

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

回答

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.RouteValueDictionaryRouteValueDictionary stocks = new RouteValueDictionary { { "MSFT ", "Microsoft Corporation" }, { "AAPL", "Apple, Inc." } };

+0

这给了我这个网址:HTTP ://本地主机:58930/d/M/5b1ab3a0-4bb3-467a-93fe-08eb16e2bb8d /中央/测试库存= System.Web.Routing.RouteValueDictionary ,其不通过值也是。 – Christine 2012-02-02 12:09:16

+0

你是在做'新股'吗还是只是'炒股'呢?使用'RouteValueDictionary',你不需要在'Url.Action'调用中使用'new'。 – JamieSee 2012-02-02 16:51:40

+0

另外,如果这仍然不提供您正在寻找的URL,请提供您希望实际URL的外观样本。 – JamieSee 2012-02-02 18:26:58

0

UrlHelper.Action需要在内部转换为RouteValueDictionary一个匿名对象:

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

或者直接一个RouteValueDictionary

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

因此,如果您的操作没有称为MSFT或APPL的参数,则路由将无法工作。你需要serialize the dictionary(或传递数据作为一个字符串的任何其他方式),并把它作为一个编码字符串(与HttpServerUtility.UrlEncode)到UrlHelper

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

然后在操作,你必须从序列化的字典中再次提取数据。