У меня есть контроллер ASP.net MVC, Designs
который имеет действие со следующей подписью:
public ActionResult Multiple(int[] ids)
Однако, когда я пытаюсь перейти к этому действию, используя URL-адрес:
http://localhost:54119/Designs/Multiple?ids=24041,24117
ids
Параметр всегда нулевой. Есть ли способ заставить MVC преобразовать ?ids=
параметр запроса URL в массив для действия? Я видел разговоры об использовании фильтра действий, но, насколько я могу судить, это будет работать только для POST, где массив передается в данных запроса, а не в самом URL.
источник
[FromUri]
.public ActionResult Multiple([FromUri]int[] ids) {}
(GET)Чтобы продолжить ответ Дарина Димитрова , вам может сойти с рук простой
string
параметр URL-адреса и его самостоятельное преобразование в массив:public ActionResult Multiple(string ids){ int[] idsArray = ids.Split(',').Select(int.Parse).ToArray(); /* ...process results... */ }
Если при этом вы получаете ошибку синтаксического анализа (из-за того, что кто-то передал вам искаженный массив), вы можете заставить обработчик исключений возвращать
400 Bad Request
ошибку вместо стандартной, более недружественной404 Not Found
ошибки, которую MVC возвращает, когда конечная точка не найдена.источник
Вы также можете использовать этот формат URL, и ASP.NET MVC сделает все за вас. Но не забудьте применить кодировку URL.
?param1[0]=3344¶m1[1]=2222
источник
Я не знаю, откуда взялась строка URL-адреса Groky, но у меня была такая же проблема с некоторым javascript, вызывающим мой контроллер / действие. Он будет создавать URL из
null
1 или многих «идентификаторов» из списка с множественным выбором (который уникален для решения, которым я собираюсь поделиться).Я скопировал / вставил привязку пользовательской модели Дарина и украсил свое действие / параметр, но это не сработало. Меня все еще
null
ценилиint[] ids
. Даже в «безопасном» случае, когда у меня действительно было много идентификаторов.Я закончил тем, что изменил javascript, чтобы создать дружественный массив параметров ASP.NET MVC, например
?ids=1&ids=2
Я должен был сделать несколько глупостей, хотя
ids || [] #=> if null, get an empty array [ids || []] #=> if a single item, wrap it in an array [].concat.apply([], ...) #=> in case I wrapped an array, flatten it
Итак, полный блок был
ids = [].concat.apply([], [ids || []]) id_parameter = 'ids=' + ids.join('&ids=')
Это грязно, но мне впервые пришлось так взламывать javascript.
источник
.Net Core Ответ
Для тех, кто приезжает сюда в последнее время, вы можете сделать это в .Net Core с помощью:
http://localhost:54119/Designs/Multiple?ids=24041&ids=24117
и:
public ActionResult Multiple([FromQuery] int[] ids) { ... }
источник