EDYCJA : 31/10/2017
Ten sam kod / podejście będzie działać również w przypadku Asp.Net Core 2.0 . Główna różnica polega na tym, że w rdzeniu asp.net zarówno kontrolery interfejsu API sieci Web, jak i kontrolery Mvc są połączone w jeden model kontrolera. Więc twój typ zwracany może być IActionResult
albo jeden To realizacji (np OkObjectResult
)
Posługiwać się
contentType:"application/json"
Musisz użyć JSON.stringify
metody, aby przekonwertować go na ciąg JSON podczas wysyłania,
Spoiwo modelu wiąże dane JSON z obiektem klasy.
Poniższy kod będzie działał dobrze (przetestowany)
$(function () {
var customer = {contact_name :"Scott",company_name:"HP"};
$.ajax({
type: "POST",
data :JSON.stringify(customer),
url: "api/Customer",
contentType: "application/json"
});
});
Wynik
contentType
właściwość informuje serwer, że wysyłamy dane w formacie JSON. Ponieważ wysłaliśmy strukturę danych JSON, powiązanie modelu nastąpi poprawnie.
Jeśli przejrzysz nagłówki żądania ajax, zobaczysz, że Content-Type
wartość jest ustawiona na application/json
.
Jeśli nie określisz jawnie contentType, użyje domyślnego typu treści, którym jest application/x-www-form-urlencoded;
Edytuj w listopadzie 2015 r., Aby rozwiązać inne możliwe problemy poruszone w komentarzach
Księgowanie złożonego obiektu
Załóżmy, że masz złożoną klasę modelu widoku jako parametr metody akcji interfejsu API w ten sposób
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;}
}
a punkt końcowy interfejsu API jest podobny
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;
}
}
W chwili pisania tego tekstu ASP.NET MVC 6 jest najnowszą stabilną wersją, aw MVC6 zarówno kontrolery interfejsu API sieci Web, jak i kontrolery MVC dziedziczą po Microsoft.AspNet.Mvc.Controller
klasie podstawowej.
Aby wysłać dane do metody od strony klienta, poniższy kod powinien działać poprawnie
//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 :)
});
Wiązanie modelu działa w przypadku niektórych właściwości, ale nie wszystkich! Dlaczego ?
Jeśli nie ozdobisz parametru metody interfejsu API WWW [FromBody]
atrybutem
[HttpPost]
public CreateUserViewModel Save(CreateUserViewModel m)
{
return m;
}
I wyślij model (surowy obiekt javascript, nie w formacie JSON) bez określania wartości właściwości contentType
$.ajax({
type: "POST",
data: model,
url: "../product/save"
}).done(function (res) {
console.log('res', res);
});
Wiązanie modelu będzie działać dla płaskich właściwości w modelu, a nie dla właściwości, w których typ jest złożony / inny typ. W naszym przypadku, Id
i Name
właściwości zostaną właściwie związany z parametrem m
, jednak Tags
nieruchomość będzie pusta lista.
Ten sam problem wystąpi, jeśli używasz krótkiej wersji, $.post
która będzie używać domyślnego typu zawartości podczas wysyłania żądania.
$.post("../product/save", model, function (res) {
//res contains the markup returned by the partial view
console.log('res', res);
});