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