Передача массива в RouteValues ​​и его визуализация с привязкой к модели - PullRequest
12 голосов
/ 05 декабря 2011

При передаче RouteValueDicitonary или анонимного объекта в метод @ Url.Action (или любой из его аналогов), существует ли способ правильно передать объект коллекции или IEnumerable, чтобы он генерировал URL, которыйбудет совместим со связывателем модели по умолчанию?

Например, скажем, у меня есть такое действие:

public ActionResult Index(ICollection<int> ids)
  {
    ...do something
  }

и в моем шаблоне я делаю что-то вроде этого:

@Url.Action("Index", routeValues:new int[]{1,2,3})

цель состоит в том, чтобы получить URL-адрес, подобный следующему:

... /index?ids=1&ids=2&ids=3

но URL-адрес на самом деле выглядит примерно так:

... /index?ids=System.Int[]

Я предполагаю, что нетподдержка этого в настоящее время.Если нет, то в какой части MVC мне нужно создать собственный обработчик или что-то еще, чтобы переопределить эту функциональность по умолчанию?

Ответы [ 3 ]

11 голосов
/ 06 декабря 2011

К сожалению, в настоящее время нет существующего помощника, который бы позволил вам создать такой URL. Так что одна возможность - сделать это вручную:

@(Url.Action("Index") + "?" + string.Join("&", new int[] { 1, 2, 3 }.Select(x => "ids=" + x)))

или напишите метод расширения для инкапсуляции логики:

@Url.ActionWithIds("Index", new int[] { 1, 2, 3 })

Так как это целые числа, нам не нужно кодирование URL, но если вы хотите сделать то же самое с набором строк, значения должны быть правильно закодированы в URL.

2 голосов
/ 09 декабря 2015

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

int i = 0;
var temprvd = arr.ToDictionary(m => String.Format("name[{0}]", i++), m => (object) m);
@Url.Action("index", new RouteValueDictionary(temprvd));

или присоединиться к существующему словарю значений маршрута.

Приведите значение к object (как показано выше), чтобы обеспечить правильную перегрузку конструктора RouteValueDictionary.

1 голос
/ 28 марта 2013

Для использования связывателя модели по умолчанию вы должны получить что-то вроде:

?ids=1&ids=2&ids=3

, вы можете вернуть частную коллекцию с именем HttpValueCollection, даже если в документации говорится, что это NameValueCollection с использованием утилиты ParseQueryString.Затем добавьте ключи вручную, HttpValueCollection сделает кодировку для вас.А затем просто добавьте QueryString вручную:

var qs = HttpUtility.ParseQueryString(""); 
new List<int> { 1, 2, 3, 4, 5 }.ForEach(x => qs.Add("ids", x.ToString()));

@Url.Action("Index")?@qs
...