2012-07-17 123 views
40

我有一個類似ASP.NET MVC 4 RC Web API Parameter Binding Issue的問題,但我試圖通過使用[FromBody]屬性來解決它。FromBody沒有綁定字符串參數

的Fiddler報告以下請求(不包括像用戶代理字符串無關比特)

PUT http://localhost:82/api/account/shoppinglistitems HTTP/1.1 
Host: localhost:82 
Connection: keep-alive 
Content-Length: 11 
Origin: http://localhost:3000 
Content-Type: application/x-www-form-urlencoded 
Accept: application/json, text/javascript, */*; q=0.01 

query=apple 

我的控制器動作是

[HttpPut] 
public ShoppingListItemWebModel CreateShoppingListItem([FromBody]string query) { 
    // query is null 
} 

我可以包裝在一個複雜的類型的參數,但是,似乎是解決問題的手段。或者我可以將查詢放在URI中,但這不適用於其餘API的模式。這樣做有可能嗎?如果是這樣,我的錯誤在哪裏?

+1

標題說POST,但問題說PUT。只是有點誤導。 – vbullinger 2013-03-28 15:18:11

+0

Asp.Net Core的相關問題https://stackoverflow.com/questions/31952002/asp-net-core-mvc-how-to-get-raw-json-bound-to-a-string-without-a-鍵入 – 2017-11-18 01:17:06

回答

44

改變你的要求是

PUT http://localhost:82/api/account/shoppinglistitems HTTP/1.1 
Host: localhost:82 
Connection: keep-alive 
Content-Length: 11 
Origin: http://localhost:3000 
Content-Type: application/x-www-form-urlencoded 
Accept: application/json, text/javascript, */*; q=0.01 

=apple 

通知缺乏「查詢」的

+2

任何想法如何從身體中提取多個字符串? – 2012-07-17 09:47:48

+5

不可能,你必須使用複雜類型。 Mike Stall有一個很棒的博客,我把它推薦給任何對Web API模型綁定感興趣的人http://blogs.msdn.com/b/jmstall/archive/2012/04/16/how-webapi-does-parameter- binding.aspx – 2012-07-17 09:55:53

+0

當然你仍然使用[FromUri]傳遞多個簡單的類型參數 – 2012-07-17 09:57:30

21

如果您使用AngularJS而不是jQuery的你可能想選擇下面的選擇,因爲AngularJS使用內容默認爲application/json

PUT http://localhost:82/api/account/shoppinglistitems HTTP/1.1 
Host: localhost:82 
Connection: keep-alive 
Content-Length: 7 
Origin: http://localhost:3000 
Content-Type: application/json 
Accept: application/json, text/javascript, */*; q=0.01 

'apple' 

請注意,該值被包裝在字符串引號(單或雙)中。

+10

在角度方面,您可以使用[angular.toJson](https://docs.angularjs.org/api/ng/function/angular.toJson)來編碼您的有效負載,從而得到報價包裝。 – Richard 2015-12-04 07:18:14

+0

@Stony謝謝你的提示 – 2015-12-04 17:05:53