2016-12-01 51 views
1

我有一個Put操作。 Http請求值不能傳遞給第二個參數。Asp.Net核心Web Api錯誤? 「Put」無法獲得第二個參數的值?

[HttpPut("{id}")] 
public async Task<IActionResult> Put(string id, [FromBody]DPost value) 
{ 
    Console.WriteLine($"id: {id} value.MyId: {value.MyId}"); // id: B161 value.MyId: 
    return Ok(value); // breakpoint here - id has value but value.MyId is null? 
} 

以下是該類的定義。

public class DPost 
{ 
    [Key] 
    public String MyId { get; set; } 
} 

下面顯示了原始Http請求。

PUT http://localhost:5001/api/D2/B161 HTTP/1.1 
Host: localhost:5001 
Connection: keep-alive 
Content-Length: 52 
Accept: application/json, text/plain, */* 
Origin: http://localhost:8082 
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36 
Content-Type: application/json;charset=UTF-8 
Referer: http://localhost:8082/ 
Accept-Encoding: gzip, deflate, sdch, br 
Accept-Language: en-US,en;q=0.8 

{"id":"B161","value":{"myId":"B161"}} 

及其響應是

HTTP/1.1 200 OK 
Date: Thu, 01 Dec 2016 18:29:02 GMT 
Content-Type: application/json; charset=utf-8 
Server: Kestrel 
Access-Control-Allow-Origin: * 
Content-Length: 12 

{"myId":null} 

它是Asp.net核心的一個bug?我還嘗試將參數value更改爲簡單類型int?,並更改了Http請求並仍爲空。

+0

身份識別碼可能應該是大小寫敏感的,就像在你的JSON對象,所以它應該是身份識別碼。 – PmanAce

+0

嘗試將http請求更改爲「MyId」,它是一樣的。 – ca9163d9

回答

0

添加[FromBody]這樣的:

public async Task<IActionResult> Put(string id, [FromBody]DPost value) 

它告訴引擎從請求的主體檢索對象。

+0

我試過'[FromBody]',它是一樣的。 – ca9163d9

+0

我看到你傳遞的Json對象與你聲明的類不同。您是否嘗試僅在有效內容中傳遞{「myId」:「B161」}? –

+0

區別只是第一個字母,一個是大寫字母,一個是小寫字母。我試圖讓他們一樣,但沒有幫助。 – ca9163d9

0

變化MYID的以下的情況下:

public class DPost 
{ 
    [Key] 
    public String myId { get; set; } 
} 

以匹配JSON對象:

{"id":"B161","value":{"myId":"B161"}} 
+0

我將json對象中的「myId」更改爲「MyId」,它是一樣的。 – ca9163d9

1

錯誤答案:value.Id實際上被分配給第一值{id:"first", value:{id: "second"}}。它應該是「第二」。這是一個錯誤嗎?

我發現通過改變類DPost一個解決方案:

public class DPost 
{ 
    [Key] 
    public String Id { get; set; } 
} 

爲什麼?它是否需要不區分地匹配第一個參數?

+0

也許是因爲:「默認情況下,實體框架將名爲ID的屬性解釋爲主鍵。」但實際上[Key]也應該這樣做。 – Alexan

+0

這是不正確的,'value.Id'實際上被分配給put參數'id'的值。 – ca9163d9

+0

你是什麼意思? – Alexan

0

你需要把你的參數是這樣的:

{"id":"B161","myId":"B161"}