2016-05-24 23 views
1

閱讀的Guid POST我有一個控制器行動聲明爲:控制器動作不是從JSON

[Route("api/person")] 
[HttpPost] 
public async Task<IActionResult> Person([FromBody] Guid id) { ... } 

我張貼到它:

POST /api/person HTTP/1.1 
Host: localhost:5000 
Content-Type: application/json 
Cache-Control: no-cache 
Postman-Token: 747a5d76-398c-e1c7-b948-b276bb24976c 

{ 
    "id": "b85f75d8-e6f1-405d-90f4-530af8e060d5" 
} 

我的動作被擊中,但Guid那它收到的總是一個Guid.Empty值(即:它沒有得到我通過它的值)。

請注意,如果我使用的是url參數而不是[FromBody],那麼這個工作正常,但我想使用http post的主體。

+0

不應該是原始JSON字符串的id而不是對象?那麼只需「b85f75d8-e6f1-405d-90f4-530af8e060d5」? –

+0

此外,傳遞一個字符串,然後TryParse Guid。我會在我的機器上測試這個,但我的VS正在安裝。 –

+0

不是一個壞主意。我在手機上,但將在早上進行測試。 – mariocatch

回答

4

Web API documentation描述:

默認的Web API使用下列規則綁定參數:

  • 如果參數是一個「簡單」的類型,網頁API嘗試獲取來自URI的值。簡單類型包括.NET基本類型(int, bool,double等),加上TimeSpan,DateTime,Guid,十進制, 和字符串,以及任何類型的轉換器,可以從 轉換字符串。 (稍後關於類型轉換器的更多信息。)
  • 對於複雜類型,Web API嘗試使用媒體類型格式化程序從消息正文讀取值。
在部分 使用[FromBody]你可以看到,你可以以綁定請求主體的價值在你的參數添加屬性 [FromBody]樣品的同一篇文章中

而且,就像你一樣。但這裏是catch-sample節目,在這種情況下請求主體應該包含原始值,而不是JSON對象。

所以你的情況,你有兩個選擇:

第一個選項是改變你的要求提供的,而不是一個JSON對象

POST /api/person HTTP/1.1 
Host: localhost:5000 
Content-Type: application/json 
Cache-Control: no-cache 
Postman-Token: 747a5d76-398c-e1c7-b948-b276bb24976c 

"b85f75d8-e6f1-405d-90f4-530af8e060d5" 

第二個選項原始值是提供具有單一屬性的複雜對象並使用它作爲參數:

public class Request 
{ 
    public Guid Id { get; set; } 
} 

[Route("api/person")] 
[HttpPost] 
public async Task<IActionResult> Person([FromBody] Request request) { ... }