Передать словарь значения маршрута в ActionLink - PullRequest
6 голосов
/ 13 марта 2010

All

Начало работы с 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 }

Из того, что я могу сказать, этот анонимный объект в любом случае фактически преобразуется в словарь с помощью отражения, НО в первую очередь вы не можете передать ему словарь !!!

HTML-код, сгенерированный для ссылки, просто показывает тип словаря.

Как же мне обойти это? Весь смысл в том, что его общее и контроллер может установить меню. Атрибуты ранее ....

Основываясь на посте ниже, я попробовал следующее:

Html.ActionLink(Html.Encode(menu.Name), Html.Encode(menu.Action), Html.Encode(menu.Controller), new RouteValueDictionary(menu.Attributes), new Dictionary<string,object>())

но это все еще не работает (я думаю, что код внутренне вызывает универсальный метод, который принимает объекты?). Выше (и мое оригинальное решение передачи словаря 4-му параметру дает 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>

т.е. он использует рефлексию и работает неправильно ...

Ответы [ 5 ]

5 голосов
/ 02 марта 2012

Предложения по исправлению работали у меня в MVC3. Пример использования:

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

routeValues.Add("EmployeeID", 1);

@Html.ActionLink("Employee Details", "EmployeeDetails", "Employee", new RouteValueDictionary(routeValues), null);
2 голосов
/ 28 июня 2010

Graham,

menu.Attributes - это IDictionary , а метод ожидает IDictionary object > right? Скопируйте ключи и значения в другой словарь, в котором значения имеют тип объекта.

1 голос
/ 13 марта 2010

RouteValueDictionary в System.Web.Routing, на самом деле, так что да. Этот класс имеет конструктор, который принимает объект, или IDictionary<string, object>. Есть одна перегрузка, которая принимает это. Таким образом, вы можете передать RouteValueDictionary вместо.

РЕДАКТИРОВАТЬ: Я думаю, что проблема с этой частью:

new Dictionary<string,object>()) 

в конце; это должно быть нулевым. Потому что он будет извлекать общедоступные свойства словаря и использоваться неправильно. Дайте мне знать, если изменение на ноль устраняет проблему.

0 голосов
/ 19 июня 2010

Space Cow .. Я потерял исходный идентификатор, который использовал для публикации, поэтому не могу ответить на ваш вопрос напрямую.

Это было с ASP.NET MVC 1.0.

Хотя имелась перегрузка, которая, по-видимому, принимала диктонар, сгенерированный HTML был не содержимым словаря, а отраженным типом самого словаря, в основном не выполняющим то, что я ожидал. В рамках MVC не было никакого способа, чтобы я мог принять предопределенный список ключ / значение (например, в словаре) и чтобы он правильно генерировал HTML href. У меня было для создания анонимного объекта, что было невозможно в моем сценарии.

0 голосов
/ 17 июня 2010

Я использую MVC 2 и вижу более одного метода Html.ActionLink, который принимает IDictionary в качестве параметра для атрибутов Html. Есть ли какая-то причина, по которой вы не можете использовать один из них? Если вам действительно нужна более короткая форма этого метода с некоторыми значениями по умолчанию, вы можете написать метод расширения адаптера в HtmlHelper.

http://msdn.microsoft.com/en-us/library/system.web.mvc.html.linkextensions.actionlink(VS.90).aspx

Возможно, я не понимаю вашего вопроса.

...