EDIT : 31.10.2017
Der gleiche Code / Ansatz funktioniert auch für Asp.Net Core 2.0 . Der Hauptunterschied besteht darin, dass im asp.net-Kern sowohl Web-API-Controller als auch Mvc-Controller zu einem einzigen Controller-Modell zusammengeführt werden. Also Ihr könnte Rückgabetyp sein IActionResult
oder eine Implementierung von ihm ist (Beispiel: OkObjectResult
)
Verwenden
contentType:"application/json"
Sie müssen die JSON.stringify
Methode verwenden, um sie beim Senden in eine JSON-Zeichenfolge zu konvertieren.
Der Modellordner bindet die JSON-Daten an Ihr Klassenobjekt.
Der folgende Code funktioniert einwandfrei (getestet)
$(function () {
var customer = {contact_name :"Scott",company_name:"HP"};
$.ajax({
type: "POST",
data :JSON.stringify(customer),
url: "api/Customer",
contentType: "application/json"
});
});
Ergebnis
contentType
Die Eigenschaft teilt dem Server mit, dass die Daten im JSON-Format gesendet werden. Da wir eine JSON-Datenstruktur gesendet haben, erfolgt die Modellbindung ordnungsgemäß.
Wenn Sie die Header der Ajax-Anforderung überprüfen, sehen Sie, dass der Content-Type
Wert auf festgelegt ist application/json
.
Wenn Sie contentType nicht explizit angeben, wird der Standardinhaltstyp verwendet application/x-www-form-urlencoded;
Bearbeiten Sie im November 2015, um andere mögliche Probleme zu beheben, die in Kommentaren angesprochen werden
Ein komplexes Objekt buchen
Angenommen, Sie haben eine komplexe Ansichtsmodellklasse als solchen Parameter für die Web-API-Aktionsmethode
public class CreateUserViewModel
{
public int Id {set;get;}
public string Name {set;get;}
public List<TagViewModel> Tags {set;get;}
}
public class TagViewModel
{
public int Id {set;get;}
public string Code {set;get;}
}
und Ihr Web-API-Endpunkt ist wie
public class ProductController : Controller
{
[HttpPost]
public CreateUserViewModel Save([FromBody] CreateUserViewModel m)
{
// I am just returning the posted model as it is.
// You may do other stuff and return different response.
// Ex : missileService.LaunchMissile(m);
return m;
}
}
Zum Zeitpunkt dieses Schreibens ist ASP.NET MVC 6 die neueste stabile Version. In MVC6 erben sowohl Web-API-Controller als auch MVC-Controller von der Microsoft.AspNet.Mvc.Controller
Basisklasse.
Um Daten von der Clientseite an die Methode zu senden, sollte der folgende Code einwandfrei funktionieren
//Build an object which matches the structure of our view model class
var model = {
Name: "Shyju",
Id: 123,
Tags: [{ Id: 12, Code: "C" }, { Id: 33, Code: "Swift" }]
};
$.ajax({
type: "POST",
data: JSON.stringify(model),
url: "../product/save",
contentType: "application/json"
}).done(function(res) {
console.log('res', res);
// Do something with the result :)
});
Die Modellbindung funktioniert für einige Eigenschaften, aber nicht für alle! Warum ?
Wenn Sie den Web-API-Methodenparameter nicht mit [FromBody]
Attribut dekorieren
[HttpPost]
public CreateUserViewModel Save(CreateUserViewModel m)
{
return m;
}
Senden Sie das Modell (unformatiertes Javascript-Objekt, nicht im JSON-Format), ohne den Eigenschaftswert contentType anzugeben
$.ajax({
type: "POST",
data: model,
url: "../product/save"
}).done(function (res) {
console.log('res', res);
});
Die Modellbindung funktioniert für die flachen Eigenschaften des Modells, nicht für die Eigenschaften, bei denen der Typ komplex ist / ein anderer Typ. In unserem Fall Id
und Name
Eigenschaften ordnungsgemäß an die Parameter gebunden werden m
, aber die Tags
Eigenschaft wird eine leere Liste sein.
Das gleiche Problem tritt auf, wenn Sie die Kurzversion verwenden, $.post
die beim Senden der Anforderung den Standardinhaltstyp verwendet.
$.post("../product/save", model, function (res) {
//res contains the markup returned by the partial view
console.log('res', res);
});
Die Arbeit mit POST in Webapi kann schwierig sein! Möchte zur bereits richtigen Antwort hinzufügen ..
Wird sich speziell auf POST konzentrieren, da der Umgang mit GET trivial ist. Ich glaube nicht, dass viele nach einer Lösung für ein Problem mit GET mit Webapis suchen würden. Sowieso..
Wenn Ihre Frage lautet: - Verwenden Sie in MVC Web Api andere benutzerdefinierte Aktionsmethoden als die generischen HTTP-Verben. - Mehrere Posts durchführen? - Mehrere einfache Typen posten? - Komplexe Typen über jQuery posten?
Dann können die folgenden Lösungen helfen:
Fügen Sie zunächst eine Web-API-Route hinzu , um benutzerdefinierte Aktionsmethoden in der Web-API zu verwenden :
Und dann können Sie Aktionsmethoden erstellen wie:
Starten Sie nun die folgende jQuery über Ihre Browserkonsole
Zweitens, um mehrere Beiträge auszuführen , ist es einfach, mehrere Aktionsmethoden zu erstellen und mit dem Attribut [HttpPost] zu dekorieren. Verwenden Sie den [Aktionsnamen ("MyAction")], um benutzerdefinierte Namen usw. zuzuweisen. Wird im vierten Punkt unten zu jQuery kommen
Drittens ist es zunächst nicht möglich , mehrere EINFACHE Typen in einer einzigen Aktion zu veröffentlichen. Darüber hinaus gibt es ein spezielles Format , um auch nur einen einfachen Typ zu veröffentlichen (abgesehen von der Übergabe des Parameters in der Abfragezeichenfolge oder im REST-Stil). Dies war der Punkt, an dem ich mich mit Rest Clients (wie der Advanced REST-Client-Erweiterung von Fiddler und Chrome) in den Kopf schlug und fast 5 Stunden lang im Internet herumjagte, als sich schließlich die folgende URL als hilfreich erwies. Wird der relevante Inhalt für den Link zitieren könnte tot werden!
PS: Haben Sie die eigentümliche Syntax bemerkt ?
http://forums.asp.net/t/1883467.aspx?The+received+value+is+null+when+I+try+to+Post+to+my+Web+Api
Wie auch immer, lassen Sie uns über diese Geschichte hinwegkommen. Weiter geht's:
Viertens wird das Posten komplexer Typen über jQuery, natürlich $ .ajax (), sofort in die Rolle kommen:
Angenommen, die Aktionsmethode akzeptiert ein Personenobjekt mit einer ID und einem Namen. Also, aus Javascript:
Und die Aktion wird aussehen wie:
All das hat bei mir funktioniert !! Prost!
quelle
Ich habe gerade damit gespielt und ein ziemlich seltsames Ergebnis entdeckt. Angenommen, Sie haben öffentliche Eigenschaften für Ihre Klasse in C # wie folgt:
Dann müssen Sie den von Shyju vorgeschlagenen Trick JSON.stringify ausführen und ihn folgendermaßen aufrufen:
Wenn Sie jedoch Getter und Setter für Ihre Klasse wie folgt definieren:
dann kann man es viel einfacher nennen:
Dies verwendet den HTTP-Header:
Ich bin mir nicht ganz sicher, was hier passiert, aber es sieht aus wie ein Fehler (Feature?) Im Framework. Vermutlich rufen die verschiedenen Bindungsmethoden unterschiedliche "Adapter" auf, und während der Adapter für application / json one mit öffentlichen Eigenschaften arbeitet, funktioniert der Adapter für formularcodierte Daten nicht.
Ich habe jedoch keine Ahnung, welche als Best Practice gelten würde.
quelle
Verwenden Sie JSON.stringify () , um die Zeichenfolge im JSON-Format abzurufen. Stellen Sie sicher, dass Sie beim Ausführen des AJAX-Aufrufs die folgenden Attribute übergeben:
Unten finden Sie den JQuery-Code für einen Ajax-Post-Aufruf der asp.net-Web-API:
quelle
Stellen Sie sicher, dass Ihr WebAPI-Dienst ein stark typisiertes Objekt mit einer Struktur erwartet, die dem von Ihnen übergebenen JSON entspricht. Stellen Sie sicher, dass Sie den JSON, den Sie POSTEN, stringifizieren.
Hier ist mein JavaScript (mit AngluarJS):
Und hier ist mein WebAPI-Controller:
quelle
Der folgende Code zum Zurückgeben von Daten im JSON-Format anstelle der XML-Web-API 2: -
Fügen Sie die folgende Zeile in die Datei Global.asax ein
quelle
quelle
Microsoft gab ein gutes Beispiel dafür:
https://docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/sending-html-form-data-part-1
Überprüfen Sie zuerst die Anfrage
und dann die serialisierten Daten verwenden.
Hier ist 'Status' ein Feld im komplexen Typ. Die Serialisierung erfolgt über .NET, Sie müssen sich darüber keine Sorgen machen.
quelle
1) Auf Ihrer Client-Seite können Sie eine http.post-Anfrage in einer Zeichenfolge wie unten senden
2) Dann können Sie es in Ihrem Web-API-Controller deserialisieren
3) Ihre ApiReceivedListOfObjects-Klasse sollte wie folgt aussehen
4) Stellen Sie sicher, dass Ihre serialisierte Zeichenfolge (IndexInfo hier) wie folgt aussieht, bevor Sie den Befehl JsonConvert.DeserializeObject in Schritt 2 ausführen
quelle