2013-06-10 7 views
14

ich eine Funktion in der Struktur ähnlich dieses:Passing eine Liste von int zu einem HttpGet Anfrage

[HttpGet] 
public HttpResponseMessage GetValuesForList(List<int> listOfIds) 
{ 
    /* create model */   

    foreach(var id in listOfIds) 
     model.Add(GetValueForId(id) 

    /* create response for model */ 
    return response; 
} 

Allerdings, wenn ich tun, um eine Get-Anfrage für die Methode:

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

ich ein Fehler beim Debuggen, dass listOfIds ist null. In unserem Controller haben wir eine Reihe von öffentlichen HttpGet-Methoden, die gut funktionieren, und wenn der Parameter zu einem einzigen int geändert wird, funktioniert es. Ich habe versucht, zu dem Parametertyp int[] und IEnumerable<int> verändern, aber keine Änderung.

jedoch, wenn der Anruf zu einer Httppost ändern und Leiten der Liste als x-www-form-urlencoded Wert arbeitet das Verfahren.

Ist es möglich, eine Liste zu einem Get-Methode übergeben, oder muss ich Post benutzen? Da es sich nicht um eine Post-Methode handelt (da es ein JSON-Modell von Werten zurückgibt und nichts auf dem Server gespeichert wird).

+1

Werfen Sie einen Blick auf [diese Antwort] (http://stackoverflow.com/a/2776855/706456). Das sendende Bit sieht korrekt aus, das Lesebit muss angepasst werden. Und [ein anderer] (http://stackoverflow.com/a/2301142/706456), wo alles einfach zu sein scheint. – oleksii

+0

Ich hatte bereits versucht, den zweiten Link, den Sie geliefert haben, ohne Glück, aber der erste führte mich zu einer Methode, die eine Kombination aus dieser URL und der Antwort von @ C.B. ist, die ich unten hinzugefügt habe. Danke – StormPooper

Antwort

23

Wenn Sie MVC WebAPI verwenden, dann können Sie Ihre Methode wie folgt erklären blabla.com/GetTotalItemsInArray?listOfIds=1&listOfIds=2&listOfIds=3

dies Array entsprechen [1, 2, 3 ] in listOfIds param (und 3 zurück, wie erwartet)

+0

Danke, ich habe FromUri schon mal gesehen, habe aber nie daran gedacht es auszuprobieren. Änderte die angenommene Antwort zu diesem. – StormPooper

+0

Link scheint kaputt zu sein, wäre toll, auch im Beispiel den grundlegenden Client-Code zu haben. – Jon

+0

@Jon ist ein falscher Link (blabla.com) .. ich gab nur ein Beispiel dafür, wie die URL im Client aussehen würde. Es gibt keinen spezifischen Code .. Sie können es mit jQuery, Anchor-Tag oder plain javascript verwenden. –

3

Hier ist eine schnelle Hack, bis Sie eine bessere Lösung zu finden:

  • Verwendung
  • dann "listOfIds = 1,2,5,8,21,34?":
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 */ 
    ... 
+0

Yeah, ich hoffe, keine manuelle Listenumwandlung zu machen, aber wenn niemand sonst eine bessere Antwort hat, würde ich das lieber machen als eine POST-Methode zu machen. Danke – StormPooper

0

Bisher habe ich eine Kombination aus dem Kommentar von @oleksii und der Antwort von @CB, aber TryParse mit mit Fehlern und einem null-Check umgeht es einen optionaler 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 einer Form habe ich die Antwort @oleksii auf von here verknüpft ändern musste Params statt Forms zu bedienen und kombiniert, dass mit dem Vorschlag von @ C.B. um die Zeichenfolgenwerte zu int zu analysieren.

Während dies für die traditionelle listOfIds=1&listOfIds=2 ermöglicht, bedarf es noch Strings Ints konvertieren.

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

und dann fragen Sie wie folgt aus::

+0

Ich habe dies zu meiner akzeptierten Antwort gesetzt, aber wenn jemand eine bessere Art hat dies zu tun, bitte posten Sie es und ich werde Ihre als die genehmigte Antwort markieren. – StormPooper

+0

Bitte lesen Sie die Antwort von @ liran-brimer für eine bessere Lösung. – StormPooper

-1

Sie können auch die serialisierten Array in der Anforderungszeichenfolge auf den Client weitergeben können und deserialisieren auf Server-Seite:

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

Für den Query-String:

"MyMethod?listOfIds=" + ArrlistOfIds 

Und dann in der Server-Seite, deserialisieren gerade:

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

Jetzt haben Sie eine Liste von IDs, die in int analysiert werden können.Int32.TryParse(id, out result)

Verwandte Themen