2012-12-19 15 views
6

Ich habe ein .net MVC 4 Webapi-Projekt, das ich versuche, ein Array eines Objekts an eine Methode auf meinem Controller übergeben.übergeben Array eines Objekts an Webapi

Ich habe einige Beispiele hier auf SO gefunden, die darüber sprechen, dass ich die Eigenschaften meines Objekts einstellen muss mit: param1 = was auch immer & param2 = bling & param3 = blah.

Aber ich sehe nicht, wie ich in einer Sammlung damit umgehen kann.

Hier ist meine Methode Unterschrift. Hinweis Ich habe das Argument mit dem Attribut [FromUri] versehen.

public List<PhoneResult> GetPhoneNumbersByNumbers([FromUri] PhoneRequest[] id) 
{ 
    List<PhoneResult> prs = new List<PhoneResult>(); 
    foreach (PhoneRequest pr in id) 
    { 
     prs.Add(PhoneNumberBL.GetSinglePhoneResult(pr.PhoneNumber, pr.RfiDate, pr.FinDate, pr.State)); 
    } 
    return prs; 
} 

hier ist mein einfaches PhoneRequest Objekt:

public class PhoneRequest 
{ 
    public string PhoneNumber { get; set; } 
    public string RfiDate { get; set; } 
    public string FinDate { get; set; } 
    public string State { get; set; } 
} 

und hier ist ein Beispiel dessen, was ich verwende passieren in: mit „bad Anfrage

http://localhost:3610/api/phonenumber/getphonenumbersbynumbers/ 
    [{"PhoneNumber":"8016667777","RfiDate":"","FinDate":"2012-02-11","State":"UT"}, 
    {"PhoneNumber":"8018889999","RfiDate":"2012-12-01","FinDate":"","State":"UT"}] 

mit diesem kommt zurück "

Ich habe auch versucht, diese

http://localhost:3610/api/phonenumber/getphonenumbersbynumbers? 
    id=[{"PhoneNumber":"8016667777","RfiDate":"","FinDate":"2012-02-11","State":"UT"}, 
     {"PhoneNumber":"8018889999","RfiDate":"2012-12-01","FinDate":"","State":"UT"}] 

erreicht zwar die Methode, aber das Array ist null.

Wie kann ich ein Array meines PhoneRequest-Objekts an meine Web-API-Methode übergeben?

+0

Wie ich in einem [Kommentar] (http://stackoverflow.com/questions/13962748/pass-array-of-an-object-to-webapi/13963155#comment28579974_13963155) zu @Maggie Ying [Antwort] (http://stackoverflow.com/a/13963155/326110), sollte der Methodenname ('getphonenumberbynumbers') ** nicht ** Teil der URL in ASP.NET Web API sein. Stattdessen wird die zu verwendende Methode normalerweise durch das HTTP-Verb bestimmt. Weitere Informationen finden Sie unter [Routing in ASP.NET Web API] (http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api) –

Antwort

7

Versuchen Sie, die PhoneRequest [] aus dem uri in diesem Format übergeben:

http://localhost:3610/api/phonenumber/getphonenumbersbynumbers? 
    id[0][PhoneNumber]=8016667777&id[0][FinDate]=2012-02-11&id[0][State]=UT& 
    id[1][PhoneNumber]=8018889999&id[1][RfiDate]=2012-12-01&id[1][State]=UT 
+0

Ich habe einen Breakpoint auf meine Methodensignatur gesetzt, die ID kommt immer noch als null. Irgendwelche anderen Ideen? –

+0

Interessant, ich war in der Lage, dies zum Modell binden richtig zu bekommen ... Haben Sie versucht, die URL ein wenig vereinfacht (sagen Sie einfach '? ID [0] [State] = UT') und sehen, ob Sie immer noch Null? –

+0

Ich habe alle möglichen verschiedenen URL-Strings ausprobiert. Am Ende musste ich jquery.ajax() verwenden, um es korrekt zu binden.Ich bin mir sicher, dass die Leute, die den Service konsumieren, damit leben können. Ziemlich sicher, dass es etwas war, das ich falsch in der Probe gemacht habe, die Sie zur Verfügung gestellt haben, weil ich mehrere andere Ressourcen gelesen habe, die mir sagten, dass ich dasselbe mache, das Sie umrissen haben, also werde ich das als richtig markieren ... danke. –

5

Ich schlage vor, Sie verwenden POST dafür.

Wenn Sie die Abfragezeichenfolge erweitern, treten Probleme mit der maximalen Länge der URL auf, die vom Browser abhängig ist.

Wenn Sie viele Parameter übergeben müssen, ist ein POST auch dann akzeptabel, wenn Sie wirklich nur Daten abrufen. Was Sie jedoch verlieren werden, ist die Möglichkeit für den Benutzer, eine bestimmte Seite mit der Abfragezeichenfolge zu markieren.

+0

In Verbindung mit der fehlenden Unterstützung für das bookmarking verhindert das Ändern von 'GET's zu' POST's auch, dass Benutzer Ihren Endpunkt aus einem Browser heraus verwenden/testen. Sie müssen irgendwie eine 'POST' Anfrage erstellen. Manchmal ist dies bequem und oft erwünscht. –

0

Ich erstellte ein benutzerdefiniertes Modellbinder, die FieldValueModelBinder Klasse, die jedes Objekt mit verschachtelten Array oder generische Listentypen von Daten mit Abfragezeichenfolgen mit Feldname Paare effektiv übergeben kann, ohne JSON und XML-Strukturen einzubetten. Der Modellbinder kann alle oben beschriebenen Probleme lösen. Da diese Frage um die Frage-ID 19302078 erweitert wurde, können Sie in diesem Thread Details zu meiner Antwort sehen.

Verwandte Themen