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)