2012-07-17 127 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