Tengo un controlador ASP.net MVC llamado Designs
que tiene una acción con la siguiente firma:
public ActionResult Multiple(int[] ids)
Sin embargo, cuando intento navegar a esta acción usando la URL:
http://localhost:54119/Designs/Multiple?ids=24041,24117
El ids
parámetro siempre es nulo. ¿Hay alguna forma de hacer que MVC convierta el ?ids=
parámetro de consulta de URL en una matriz para la acción? He visto hablar de usar un filtro de acción, pero por lo que puedo decir, eso solo funcionará para POST donde la matriz se pasa en los datos de solicitud en lugar de en la URL en sí.
fuente
[FromUri]
.public ActionResult Multiple([FromUri]int[] ids) {}
(GET)Para ampliar la respuesta de Darin Dimitrov , algo con lo que puede salirse con la suya es aceptar un
string
parámetro simple en su URL y convertirlo en una matriz usted mismo:public ActionResult Multiple(string ids){ int[] idsArray = ids.Split(',').Select(int.Parse).ToArray(); /* ...process results... */ }
Si obtiene un error de análisis al hacer esto (porque alguien le pasó una matriz mal formada), puede hacer que su controlador de excepciones devuelva un
400 Bad Request
error en lugar del error predeterminado, más hostil404 Not Found
que MVC devuelve cuando no se encuentra un punto final.fuente
También puede usar este formato de URL y ASP.NET MVC hará todo por usted. Pero recuerde aplicar la codificación de URL.
?param1[0]=3344¶m1[1]=2222
fuente
No sé de dónde venía la cadena de URL de Groky, pero tuve el mismo problema con algunos javascript llamando a mi controlador / acción. Construiría una URL de
null
, 1 o muchas "ID" de una lista de selección múltiple (que es única para la solución que voy a compartir).Copié / pegué la carpeta de modelos personalizados de Darin y decoré mi acción / parámetro, pero no funcionó. Todavía me
null
valoranint[] ids
. Incluso en el caso "seguro" en el que en realidad tenía muchas identificaciones.Terminé cambiando el javascript para producir una matriz de parámetros amigable ASP.NET MVC como
?ids=1&ids=2
Aunque tuve que hacer algunas tonterías
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
Entonces, el bloque completo fue
ids = [].concat.apply([], [ids || []]) id_parameter = 'ids=' + ids.join('&ids=')
Es complicado, pero es la primera vez que tengo que piratear así en javascript.
fuente
Respuesta de .Net Core
Para aquellos que vienen aquí en los últimos tiempos, pueden hacer esto en .Net Core con:
http://localhost:54119/Designs/Multiple?ids=24041&ids=24117
y:
public ActionResult Multiple([FromQuery] int[] ids) { ... }
fuente