2015-12-30 22 views
10

Mogę wysyłać moje dane do serwera, ale TYLKO kiedy używam Atrybutu FromBody.Dlaczego potrzebuję Atrybutu FromBody, gdy oczekuję danych w treści POST

Dlaczego dane json nie są automatycznie odczytywane z ciała za pomocą postu?

Backend Web API

[HttpPost] 
public async Task<IActionResult> Post([FromBody]CreateSchoolyearRequestDTO dto) 
{ 

} 

Frontend angularjs

this.createSchoolyear = function (schoolyear) { 
    var path = "/api/schoolyears"; 
    return $http({ 
     url: path, 
     method: "POST", 
     data: schoolyear, 
     contentType: "application/json" 
    }).then(function (response) { 
     return response; 
    }); 
}; 
+0

Ponieważ wysyłasz dane stanowiska ładowności (w POST ciała) – dfsq

Odpowiedz

19

Tylko dlatego, że coś jest żądanie POST, nie ma jasnej reguły jak argumenty są przekazywane. Żądanie POST może nadal zawierać parametry zapytania zakodowane w adresie URL. Oczekuje się, że parametr metody będzie parametrem zapytania dla "prostych" typów (łańcuchów, znaków itd.).

Złożonymi typami są zwykle obiekty POST. Standardowe żądanie ASP.NET ASPST to formularz przesłany, np. podczas logowania. Parametry w tym żądaniu są zwykle kodowane jako application/x-www-form-urlencoded, w zasadzie ciąg par klucz/wartość. W przypadku złożonych typów parametrów, np. zobacz obiekty modelu widoku, przyjmuje się, że jest to wartość domyślna.

Dla wszystkich innych niedomyślnych sytuacji należy jasno określić, skąd pochodzi parametr metody, w jaki sposób jest przesyłany w żądaniu. W tym celu, istnieje wiele różnych atrybutów:

  • FromBodyAttribute - dla parametrów, które pochodzą z ciała żądanie
  • FromFormAttribute - dla parametrów, które pochodzą z jednego pola danych formularzy
  • FromHeaderAttribute - dla parametrów że pochodzą z pola nagłówka HTTP
  • FromQueryAttribute - Dla parametrów, które pochodzą z argumentem zapytania zakodowany w adresie URL
  • FromRouteAttribute - Dla parametrów, które pochodzą z ro Dane ute
  • FromServicesAttribute - Dla parametrów, dla których usługi powinny być wstrzykiwane w metodzie poziomie
+0

całkowicie zapomniał, że post jest czytanie zbyt z URL. Wtedy FromBody ma sens! – Pascal

+0

Wydaje mi się, że tak funkcjonuje interfejs Web API, ale teraz połączenia sieciowe i MVC są połączone. Jest to przełomowa zmiana w środowisku ASP.NET Core. Mój poprzedni projekt Web API działał zgodnie z oczekiwaniami, teraz muszę umieścić [FromBody] wszędzie. '[FromBody]' zmusił JSON.net do użycia –

+1

@ LukeTO'Brien Tak, ASP.NET Core jest celowo niekompatybilny z klasycznym ASP.NET MVC/WebAPI. W związku z tym oczekuje się, że zmiany zostaną przełamane. - W przypadku kontrolerów API będzie można używać atrybutu "[ApiController] zaczynającego się od ASP.NET Core 2.1, aby umożliwić wywnioskowanie powiązania modelu" FromBody "(wraz z [kilkoma innymi konwencjami] (https: // blogs. msdn.microsoft.com/webdev/2018/02/02/asp-net-core-2-1-roadmap/#mvc)), więc nie będziesz już potrzebował atrybutu dla każdej akcji. – poke