Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

FromBody not binding string parameter

I have an issue similar to ASP.NET MVC 4 RC Web API Parameter Binding Issue, but I'm trying to solve it by using the [FromBody] attribute.

Fiddler reports the following request (excluding irrelevant bits like User Agent String)

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 

My controller action is

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

I could wrap the parameter in a complex type, but that seems like a hack to fix the issue. Or I could put the query in the URI, but that doesn't fit the pattern of the rest of the API. Is it possible to do it this way? If so, where is my mistake?

like image 301
Jordan Crittenden Avatar asked Jul 17 '12 02:07

Jordan Crittenden


People also ask

What does FromBody mean in C#?

The [FromBody] attribute which inherits ParameterBindingAttribute class is used to populate a parameter and its properties from the body of an HTTP request. The ASP.NET runtime delegates the responsibility of reading the body to an input formatter.

Can we declare FromBody attribute on multiple parameters?

The [FromBody] attribute can be applied on only one primitive parameter of an action method. It cannot be applied to multiple primitive parameters of the same action method.

Why your FromBody parameter is always null?

If you need to get multiple values from the request body, define a complex type. But still the value of email is NULL . The JavaScript code is part of generic method we use, so that's why the content-type is set to application/json; charset=utf-8 .

What is the difference between FromUri and FromBody?

The [FromUri] attribute is prefixed to the parameter to specify that the value should be read from the URI of the request, and the [FromBody] attribute is used to specify that the value should be read from the body of the request.


2 Answers

change your request to be

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 

notice the lack of "query"

like image 133
Filip W Avatar answered Oct 07 '22 23:10

Filip W


If you're using AngularJS instead of jQuery you might want to opt for the following alternative, since AngularJS uses content type application/json by default.

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' 

Notice that the value is wrapped in string quotes (either single or double).

like image 31
tsemer Avatar answered Oct 07 '22 22:10

tsemer