FromBody没有绑定字符串参数

Jor*_*den 42 .net c# asp.net-web-api

我有一个类似于ASP.NET MVC 4 RC Web API参数绑定问题的问题,但我试图通过使用[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
Run Code Online (Sandbox Code Playgroud)

我的控制器动作是

[HttpPut]
public ShoppingListItemWebModel CreateShoppingListItem([FromBody]string query) {
    // query is null
}
Run Code Online (Sandbox Code Playgroud)

我可以将参数包装在一个复杂的类型中,但这似乎是一个修复问题的黑客.或者我可以将查询放在URI中,但这不符合API其余部分的模式.有可能这样做吗?如果是的话,我的错误在哪里?

Fil*_*p W 45

改变你的要求

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
Run Code Online (Sandbox Code Playgroud)

注意缺乏"查询"

  • 不可能,你必须使用复杂的类型.Mike Stall有一个很棒的博客,我推荐给任何对Web API模型绑定感兴趣的人http://blogs.msdn.com/b/jmstall/archive/2012/04/16/how-webapi-does-parameter-binding的.aspx (5认同)
  • 知道如何从身体中提取多个字符串吗? (2认同)
  • 谢谢你的链接.我还发现如果您不想创建模型,可以使用`Request.Content.ReadAsStringAsync().Result`来自己解析内容. (2认同)

tse*_*mer 23

如果您使用的是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'
Run Code Online (Sandbox Code Playgroud)

请注意,该值包含在字符串引号中(单引号或双引号).

  • 在angular中,您可以使用[angular.toJson](https://docs.angularjs.org/api/ng/function/angular.toJson)对您的有效负载进行编码,从而获得报价包装. (11认同)