Тип отображается как значение параметра с Url.Action - PullRequest
0 голосов
/ 01 февраля 2012

С этим кодом:

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 ]

1 голос
/ 01 февраля 2012

Это потому, что Dictionary<T, U> не переопределяет ToString (). Созданные таким образом анонимные объекты, var stocks = new { MSFT = "Microsoft Corporation", AAPL = "Apple, Inc." };, делают. Анонимный объект выдает {MSFT = Microsoft Corporation, AAPL = Apple, Inc.} в качестве своего вывода при вызове ToString (), который Action анализирует для создания параметров. Я полагаю, что вы также должны иметь возможность использовать System.Web.Routing.RouteValueDictionary, который создан следующим образом: RouteValueDictionary stocks = new RouteValueDictionary { { "MSFT ", "Microsoft Corporation" }, { "AAPL", "Apple, Inc." } };.

0 голосов
/ 02 февраля 2012

UrlHelper.Action принимает анонимный объект, который внутренне преобразуется в RouteValueDictionary:

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

Или непосредственно RouteValueDictionary:

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

И соответствует словарюключи от параметров действия.Если они совпадают, значение добавляется в строку запроса (или путь маршрута, в зависимости от правил маршрутизации Url).

Таким образом, если в вашем действии нет параметров, называемых MSFT или APPL, маршрутизация не будетРабота.Вам нужно сериализовать словарь (или любой другой способ передачи данных в виде строки) и передать его в виде закодированной строки (с HttpServerUtility.UrlEncode) в UrlHelper:

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

Затем в действии вам придется снова извлечь данные из сериализованного словаря.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...