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);
});
Praca z POST w webapi może być trudna! Chciałbym dodać do już poprawnej odpowiedzi ..
Skoncentruje się szczególnie na POST, ponieważ obsługa GET jest banalna. Nie sądzę, aby wielu szukało rozwiązania problemu z GET z webapis. W każdym razie ..
Jeśli twoje pytanie brzmi - w MVC Web Api, jak: - Używać niestandardowych nazw metod akcji innych niż ogólne czasowniki HTTP? - Wykonać wiele postów? - Opublikować wiele prostych typów? - Publikować złożone typy za pomocą jQuery?
Mogą pomóc następujące rozwiązania:
Po pierwsze, aby użyć niestandardowych metod działania w interfejsie API sieci Web, dodaj trasę interfejsu API jako:
A potem możesz stworzyć metody akcji, takie jak:
Teraz uruchom następujące jQuery z konsoli przeglądarki
Po drugie, aby wykonać wiele postów , jest to proste, stwórz wiele metod akcji i udekoruj atrybutem [HttpPost]. Użyj [ActionName („MyAction”)], aby przypisać niestandardowe nazwy itp. Przejdzie do jQuery w czwartym punkcie poniżej
Po trzecie, po pierwsze, opublikowanie wielu typów SIMPLE w jednym działaniu nie jest możliwe. Ponadto istnieje specjalny format publikowania nawet jednego prostego typu (oprócz przekazywania parametru w ciągu zapytania lub stylu REST). To był punkt, w którym uderzyłem głową w Rest Clients (jak Fiddler i zaawansowane rozszerzenie klienta Chrome REST dla Chrome) i polowałem w Internecie przez prawie 5 godzin, kiedy ostatecznie następujący adres URL okazał się pomocny. Przytocz odpowiednią treść linku, który może stracić ważność!
PS: Zauważyłeś osobliwą składnię ?
http://forums.asp.net/t/1883467.aspx?The+received+value+is+null+when+I+try+to+Post+to+my+Web+Api
Tak czy inaczej, przejdźmy tę historię. Iść dalej:
Po czwarte, publikowanie złożonych typów za pomocą jQuery, ofcourse, $ .ajax () wkrótce pojawi się w roli:
Powiedzmy, że metoda akcji akceptuje obiekt Person, który ma identyfikator i nazwę. Tak więc z javascript:
A akcja będzie wyglądać następująco:
Wszystkie powyższe działały dla mnie !! Twoje zdrowie!
źródło
Właśnie się z tym bawiłem i odkryłem dość dziwny wynik. Załóżmy, że masz właściwości publiczne w swojej klasie w języku C # w następujący sposób:
musisz wykonać sztuczkę JSON.stringify zgodnie z sugestią Shyju i nazwać ją tak:
Jeśli jednak zdefiniujesz metody pobierające i ustawiające w swojej klasie w następujący sposób:
możesz to nazwać znacznie prościej:
Używa to nagłówka HTTP:
Nie jestem do końca pewien, co się tutaj dzieje, ale wygląda na błąd (funkcję?) W ramach. Przypuszczalnie różne metody wiązania wywołują różne „adaptery”, i chociaż adapter dla aplikacji / json jeden działa z właściwościami publicznymi, ten dla danych zakodowanych w formacie nie.
Nie mam jednak pojęcia, co byłoby uważane za najlepszą praktykę.
źródło
Użyj JSON.stringify (), aby uzyskać ciąg w formacie JSON, upewnij się, że podczas wykonywania wywołania AJAX przekazujesz poniższe atrybuty:
Poniżej znajduje się kod podający jquery, aby wywołać wywołanie ajax do interfejsu API asp.net:
źródło
Upewnij się, że twoja usługa WebAPI oczekuje silnie typowanego obiektu o strukturze pasującej do przekazywanego JSON. I upewnij się, że napisałeś JSON, który publikujesz.
Oto mój JavaScript (używając AngluarJS):
A oto mój kontroler WebAPI:
źródło
Poniższy kod, aby zwrócić dane w formacie json, zamiast xml -Web API 2: -
Umieść następujący wiersz w pliku Global.asax
źródło
źródło
Microsoft podał dobry przykład tego:
https://docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/sending-html-form-data-part-1
Najpierw sprawdź poprawność żądania
i niż korzystać z serializowanych danych.
Tutaj „Status” jest polem typu złożonego. Serializacja jest wykonywana przez .NET, nie musisz się tym martwić.
źródło
1) Po stronie klienta możesz wysłać zapytanie http.post w łańcuchu jak poniżej
2) Następnie w kontrolerze interfejsu API można go przekształcić z postaci szeregowej
3) Twoja klasa ApiReceivedListOfObjects powinna wyglądać jak poniżej
4) upewnij się, że Twój szeregowany ciąg (tutaj IndexInfo) staje się podobny do poniższej struktury przed poleceniem JsonConvert.DeserializeObject w kroku 2
źródło