array von einem Objekt zu webapi
Habe ich eine .net mvc 4 webapi-Projekt, dass ich versuche, übergeben Sie ein array von einem Objekt zu einer Methode, die auf meinem controller.
Ich habe festgestellt, dass einige Beispiele hier auf, SO dass reden, dass mein Objekt Eigenschaften mit: param1=was¶m2=bling¶m3=bla.
Aber ich sehe nicht, wie ich kann in einer Sammlung benutzen.
Hier ist meine Signatur der Methode. Bemerken, ich habe dekoriert, das argument mit der [FromUri] - Attribut.
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 meine einfache 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 was ich mit zu übergeben:
http://localhost:3610/api/phonenumber/getphonenumbersbynumbers/
[{"PhoneNumber":"8016667777","RfiDate":"","FinDate":"2012-02-11","State":"UT"},
{"PhoneNumber":"8018889999","RfiDate":"2012-12-01","FinDate":"","State":"UT"}]
mithilfe dieser kommt zurück mit "bad request"
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"}]
die nicht erreichen, die Methode, aber das array ist null.
wie kann ich ein array übergeben von meinem PhoneRequest Objekt auf meine Web-API-Methode?
- Wie ich bereits in einem comment zu @Maggie Ying Antwort, den Methodennamen (
getphonenumbersbynumbers
) soll nicht werden Sie Teil der URL in ASP.NET Web-API. Stattdessen wird die Methode zu verwenden ist, bestimmt in der Regel, indem das HTTP-verb. Siehe Routing in ASP.NET Web-API
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen Weitergabe der PhoneRequest [], die aus der uri im folgenden format ein:
?id[0][State]=UT
) und sehen, ob Sie bekommen immer noch null?application/x-www-form-urlencoded
) Hauptteil einer POST-Anfrage, aber meine Sammlung von komplexen Typen immer wieder als eine leere Sammlung 🙁 ich sehe beim Debuggen, dass die Art meiner Sammlung istComplexUriAndFormObject.Models.PhoneRequest[]
, so hätte ich erwartet, dass es funktionieren identisch, für uri oder form Anforderungen 🙁/getphonenumbersbynumbers
nicht da sein sollte, richtig?POST
ing einapplication/x-www-form-urlencoded
zu Web-API, die Sie haben zu verlassen aus der tatsächlichen parameter name (in diesem Fallid
); Seit "nur ein parameter für eine Aktion können aus dem request-body", den parameter name impliziert, und darf nie als Teil der Formular-Daten. Hier ist meine erfolgreiche request-body:[0][PhoneNumber]=8016667777&[0][FinDate]=2012-02-11&[0][State]=UT&[1][PhoneNumber]=8018889999&[1][RfiDate]=2012-12-01&[1][State]=UT
Schlage ich vor, Sie POST für dieses.
Als Sie query-string wächst, Sie laufen in Probleme mit die maximale Länge der URL, die vom browser abhängig.
Wenn Sie haben eine Menge von Parametern übergeben, ein POST ist völlig akzeptabel, auch wenn Sie eigentlich nur Abrufen von Daten. Was verlieren Sie, jedoch, ist die Fähigkeit für den Benutzer ein Lesezeichen für eine bestimmte Seite mit dem query-string.
GET
s zuPOST
s verhindert auch, dass Anwendungen von trivial Nutzung/Erprobung auf Ihrem endpoint-aus in einem browser. Sie müssen Autor einePOST
Anfrage irgendwie. Das ist manchmal praktisch und oft gewünscht.Erstellte ich eine benutzerdefinierte Modell-binder, die FieldValueModelBinder Klasse, die effektiv beliebiges Objekt übergeben mit verschachtelten array-oder eine generische Liste-Arten der Daten mit query-strings mit field-name-Paare ohne Einbettung beliebiger JSON-und XML-Strukturen. Der modelbinder kann beheben alle Probleme, die oben diskutiert. Da diese Frage wurde erweitert um die Frage-ID Neunzehn Millionen drei hundert zwei tausend acht und siebzig, können Sie sehen, details meiner Antwort in diesem thread.