Ich versuche, mehrere Parameter auf einem WebAPI-Controller zu veröffentlichen. Ein Parameter stammt aus der URL und der andere aus dem Text. Hier ist die URL:
/offers/40D5E19D-0CD5-4FBD-92F8-43FDBB475333/prices/
Hier ist mein Controller-Code:
public HttpResponseMessage Put(Guid offerId, OfferPriceParameters offerPriceParameters)
{
//What!?
var ser = new DataContractJsonSerializer(typeof(OfferPriceParameters));
HttpContext.Current.Request.InputStream.Position = 0;
var what = ser.ReadObject(HttpContext.Current.Request.InputStream);
return new HttpResponseMessage(HttpStatusCode.Created);
}
Der Inhalt des Körpers ist in JSON:
{
"Associations":
{
"list": [
{
"FromEntityId":"276774bb-9bd9-4bbd-a7e7-6ed3d69f196f",
"ToEntityId":"ed0d2616-f707-446b-9e40-b77b94fb7d2b",
"Types":
{
"list":[
{
"BillingCommitment":5,
"BillingCycle":5,
"Prices":
{
"list":[
{
"CurrencyId":"274d24c9-7d0b-40ea-a936-e800d74ead53",
"RecurringFee":4,
"SetupFee":5
}]
}
}]
}
}]
}
}
Irgendeine Idee, warum die Standardbindung nicht an das offerPriceParameters
Argument meines Controllers binden kann? Es wird immer auf null gesetzt. Aber ich bin in der Lage, die Daten aus dem Körper mit dem wiederherzustellen DataContractJsonSerializer
.
Ich versuche auch, das FromBody
Attribut des Arguments zu verwenden, aber es funktioniert auch nicht.
.net
asp.net-web-api
Normand Bedard
quelle
quelle
Nativ unterstützt WebAPI das Binden mehrerer POST-Parameter nicht. Wie Colin betont, gibt es eine Reihe von Einschränkungen, die in meinem Blog-Beitrag beschrieben werden er verweist.
Es gibt eine Problemumgehung, indem Sie einen benutzerdefinierten Parameterordner erstellen. Der Code dafür ist hässlich und verworren, aber ich habe Code zusammen mit einer detaillierten Erklärung in meinem Blog veröffentlicht, der hier in ein Projekt eingefügt werden kann:
Übergeben mehrerer einfacher POST-Werte an die ASP.NET-Web-API
quelle
Wenn Attribut-Routing verwendet wird, können Sie die Attribute [FromUri] und [FromBody] verwenden.
Beispiel:
quelle
[FromRoute]
anstelle von[FromUri]
Wir haben das Json-Objekt mit der HttpPost-Methode übergeben und es in ein dynamisches Objekt analysiert. es funktioniert gut. Dies ist ein Beispielcode:
Webapi:
Der komplexe Objekttyp kann Objekt, Array und Wörterbuch sein.
quelle
Eine einfache Parameterklasse kann verwendet werden, um mehrere Parameter in einem Beitrag zu übergeben:
quelle
Sie können mehrere POST-Parameter zulassen, indem Sie die MultiPostParameterBinding-Klasse von verwenden https://github.com/keith5000/MultiPostParameterBinding
Um es zu benutzen:
1) Laden Sie den Code in den Quellordner herunter und fügen Sie ihn Ihrem Web-API-Projekt oder einem anderen Projekt in der Lösung hinzu.
2) Verwenden Sie das Attribut [MultiPostParameters] für die Aktionsmethoden, die mehrere POST-Parameter unterstützen müssen.
3) Fügen Sie diese Zeile in Global.asax.cs an einer beliebigen Stelle vor dem Aufruf von GlobalConfiguration.Configure (WebApiConfig.Register) zur Application_Start-Methode hinzu :
4) Lassen Sie Ihre Clients die Parameter als Eigenschaften eines Objekts übergeben. Ein Beispiel für ein JSON-Objekt für die
DoSomething(param1, param2, param3)
Methode ist:Beispiel JQuery:
Besuchen Sie den Link für weitere Details.
Haftungsausschluss: Ich bin direkt mit der verknüpften Ressource verbunden.
quelle
Schöne Frage und Kommentare - habe viel aus den Antworten hier gelernt :)
Beachten Sie als zusätzliches Beispiel, dass Sie auch Körper und Routen mischen können, z
So anrufen:
quelle
Wie sieht Ihre routeTemplate für diesen Fall aus?
Du hast diese URL gepostet:
Damit dies funktioniert, würde ich ein Routing wie dieses in Ihrem erwarten
WebApiConfig
:Andere Annahmen sind: - Ihr Controller wird aufgerufen
OffersController
. - Das JSON-Objekt, das Sie im Anforderungshauptteil übergeben, ist vom TypOfferPriceParameters
(kein abgeleiteter Typ). - Sie haben keine anderen Methoden auf dem Controller, die diese stören könnten (wenn Sie dies tun, versuchen Sie, sie auskommentieren und sehen Sie, was das passiert)Und wie Filip erwähnte, würde es Ihren Fragen helfen, wenn Sie anfangen, einige Antworten zu akzeptieren, da "Akzeptanzrate von 0%" die Leute glauben lassen könnte, dass sie ihre Zeit verschwenden
quelle
Wenn Sie ModelBinding nicht verwenden möchten, können Sie DTOs verwenden, um dies für Sie zu tun. Erstellen Sie beispielsweise eine POST-Aktion in DataLayer, die einen komplexen Typ akzeptiert, und senden Sie Daten aus dem BusinessLayer. Sie können dies bei einem UI-> API-Aufruf tun.
Hier sind Beispiel-DTO. Weisen Sie einem Schüler einen Lehrer zu und weisen Sie dem Schüler mehrere Papiere / Themen zu.
Anschließend kann die Aktion im DataLayer wie folgt erstellt werden:
So rufen Sie es vom BusinessLayer aus auf:
Dies funktioniert jetzt immer noch, wenn ich Daten von mehreren Schülern gleichzeitig senden möchte. Ändern Sie das
MyAction
Folgende unten. WebAPI2 muss nicht [FromBody] schreiben, standardmäßig wird der komplexe Typ [FromBody] verwendet.und dann beim Aufrufen eine
List<StudentCurriculumDTO>
der Daten übergeben.quelle
Parameter wie anfordern
Web-API-Code wie sein
quelle
Sie können die Formulardaten als Zeichenfolge abrufen:
https://docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/sending-html-form-data-part-2
quelle