query mvc fromuri frombody from body c# web-services rest get http-get

c# - mvc - web api 2 url parameters



Pasar una lista de int a una solicitud HttpGet (4)

Aquí hay un truco rápido hasta que encuentre una mejor solución:

  • use "? listOfIds = 1,2,5,8,21,34"
  • entonces:

GetValuesForList(string listOfIds) { /* [create model] here */ //string[] numbers = listOfIds.Split('',''); foreach(string number in listOfIds.Split('','')) model.Add(GetValueForId(int.Parse(number)) /* [create response for model] here */ ...

Tengo una función similar en estructura a esto:

[HttpGet] public HttpResponseMessage GetValuesForList(List<int> listOfIds) { /* create model */ foreach(var id in listOfIds) model.Add(GetValueForId(id) /* create response for model */ return response; }

Sin embargo, cuando hago una solicitud Get para el método:

{{domain}}/Controller/GetValuesForList?listOfIds=1&listOfIds=2

Recibo un error al depurar indicando que listOfIds es nulo. En nuestro controlador tenemos varios métodos públicos de HttpGet que funcionan bien, y cuando se cambia el parámetro a un solo int, funciona. He intentado cambiar el tipo de parámetro a int[] e IEnumerable<int> también, pero sin cambios.

Sin embargo, cuando se cambia la llamada a un HttpPost y se pasa la lista como un valor de x-www-form-urlencoded, el método funciona.

¿Es posible pasar una lista a un método Get o tendré que usar Publicar? Ya que no es realmente un método de publicación (ya que devuelve un modelo de valores JSON y no se guarda nada en el servidor).


Hasta ahora tengo una combinación del comentario de @oleksii y la respuesta de @CB, pero utilizando TryParse para tratar los errores y una comprobación nula para hacer que sea un parámetro opcional.

var paramValues = HttpContext.Current.Request.Params.GetValues("listOfIds"); if (paramValues != null) { foreach (var id in paramValues) { int result; if (Int32.TryParse(id, out result)) model.Add(GetValueForId(Add(result)); else // error handling } }

Como los valores no se transfieren desde un formulario, tuve que cambiar la respuesta a la que @oleksii enlazó desde here para usar Params lugar de Forms y combiné eso con la sugerencia de @CB para analizar los valores de cadena a int.

Si bien esto permite el tradicional listOfIds=1&listOfIds=2 , aún requiere la conversión de cadenas a ints.


Si está utilizando MVC WebAPI, puede declarar su método así:

[HttpGet] public int GetTotalItemsInArray([FromUri]int[] listOfIds) { return listOfIds.Length; }

y luego consulta de este modo: blabla.com/GetTotalItemsInArray?listOfIds=1&listOfIds=2&listOfIds=3

esto hará coincidir la matriz [1, 2, 3] en el parámetro listOfIds (y devolverá 3 como se esperaba)


También puede pasar la matriz serializada en la cadena de solicitud en el cliente y deserializar en el lado del servidor:

var listOfIds = [1,2,3,45]; var ArrlistOfIds = JSON.stringify(listOfIds);

Para la cadena de consulta:

"MyMethod?listOfIds=" + ArrlistOfIds

Y luego en el lado del servidor, simplemente deserializar:

public ActionResult MyMethod(string listOfIds = null) { List<string> arrStatus = new System.Web.Script.Serialization.JavaScriptSerializer().Deserialize<string[]>(arrStatusString).ToList(); ....... }

Ahora tiene una lista de identificadores que se pueden analizar a int. Int32.TryParse(id, out result)