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);
});