Ich habe eine ähnliche Funktion wie diese:
[HttpGet]
public HttpResponseMessage GetValuesForList(List<int> listOfIds)
{
/* create model */
foreach(var id in listOfIds)
model.Add(GetValueForId(id)
/* create response for model */
return response;
}
Wenn ich jedoch eine Get-Anfrage für die Methode mache:
{{domain}}/Controller/GetValuesForList?listOfIds=1&listOfIds=2
Beim Debuggen wird eine Fehlermeldung angezeigt, die besagt, dass listOfIds
null ist. In unserem Controller haben wir eine Reihe von öffentlichen HttpGet-Methoden, die gut funktionieren. Wenn Sie den Parameter in ein einzelnes int ändern, funktioniert es. Ich habe versucht, den Parametertyp auch in int[]
und IEnumerable<int>
zu ändern, aber keine Änderung.
Wenn Sie jedoch den Aufruf in einen HttpPost ändern und die Liste als x-www-form-urlencoded-Wert übergeben, funktioniert die Methode.
Kann eine Liste an eine Get-Methode übergeben werden, oder muss ich Post verwenden? Da es sich nicht wirklich um eine Post-Methode handelt (da ein JSON-Modell von Werten zurückgegeben wird und nichts auf dem Server gespeichert wird).
Wenn Sie MVC WebAPI verwenden, können Sie Ihre Methode folgendermaßen definieren:
[HttpGet]
public int GetTotalItemsInArray([FromUri]int[] listOfIds)
{
return listOfIds.Length;
}
und dann fragen Sie wie folgt ab: blabla.com/GetTotalItemsInArray?listOfIds=1&listOfIds=2&listOfIds=3
dies wird mit Array [1, 2, 3] in listOfIds param übereinstimmen (und wie erwartet 3 zurückgeben)
Hier ist ein kurzer Hack, bis Sie eine bessere Lösung finden:
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 */
...
Bisher habe ich eine Kombination aus dem Kommentar von @oleksii und der Antwort von @ C.B, aber TryParse für die Behandlung von Fehlern und eine Nullprüfung verwendet, um es zu einem optionalen Parameter zu machen.
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
}
}
Da die Werte nicht von einem Formular übergeben werden, musste ich die Antwort @oleksii ändern, auf die von hier verwiesen wurde, um Params
anstelle von Forms
zu verwenden, und dies mit dem Vorschlag von @ C.B kombiniert. um die String-Werte nach int zu parsen.
Dies ermöglicht zwar den herkömmlichen listOfIds=1&listOfIds=2
, erfordert jedoch immer noch das Konvertieren von Strings in Ints.