Подтвердить что ты не робот

Передача массива в RouteValues ​​и его рендеринг URL-адреса, совместимого с связующим

При передаче 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 мне нужно создать собственный обработчик или что-то другое, чтобы переопределить эту функциональность по умолчанию?

4b9b3361

Ответ 1

К сожалению, в настоящее время нет существующего помощника, который позволит вам генерировать такой 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

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

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

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

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

Ответ 3

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

?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")[email protected]