2015-12-30 56 views
10

我可以將數據發送到服務器,但僅在使用FromBody-Attribute時。爲什麼我需要FromBody屬性期待POST主體中的數據

爲什麼json數據不能自動從郵件正文中讀取?

後端Web API

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

} 

前端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

因爲您發送POST數據作爲有效載荷(在POST體)注入 – dfsq

回答

19

僅僅因爲某事是一個POST請求,也沒有明確的規則參數是如何被轉移。 POST請求仍然可以包含URL中編碼的查詢參數。方法參數應該是「簡單」類型(字符串,整數等)的查詢參數。

複雜類型通常預計是POST表單對象。標準的ASP.NET POST請求是一個表單提交,例如這些請求中的參數通常編碼爲application/x-www-form-urlencoded,基本上是一串鍵/值對。對於複雜的參數類型,例如表單視圖模型對象,這是默認的。

對於所有其他非默認情況,您需要明確方法參數的來源,以及它在請求中的傳輸方式。爲此目的,有許多不同的屬性的:

  • FromBodyAttribute - 對於參數來自請求主體
  • FromFormAttribute - 對於參數來自單一形式的數據字段
  • FromHeaderAttribute - 對於參數該來自HTTP報頭字段
  • FromQueryAttribute - 對於來自在URL編碼的查詢參數
  • FromRouteAttribute參數 - 對於參數來從RO UTE數據
  • FromServicesAttribute - 對於參數哪些服務應該在方法級
+0

完全忘了張貼太從URL讀。那麼FromBody是有道理的! – Pascal

+0

我認爲這就是Web API的工作原理,但現在web api和MVC合併了,這是ASP.NET Core的一次重大變革。我以前的Web API項目按預期工作,現在我不得不把[FromBody]放到任何地方。 '[FromBody]'強制使用JSON.net –

+1

@ LukeTO'Brien是的,ASP.NET Core故意與傳統的ASP.NET MVC/WebAPI不兼容。因此,您預計會發生突變。 - 對於API控制器,您將能夠使用從ASP.NET Core 2.1開始的'[ApiController]'屬性來啓用推斷的'FromBody'模型綁定(以及[一些其他約定](https:// blogs)。 msdn.microsoft.com/webdev/2018/02/02/asp-net-core-2-1-roadmap/#mvc)),所以你不再需要每個動作的屬性。 – poke

相關問題