By Amila


2013-09-30 11:55:39 8 Comments

I'm trying to get a post request to work with the web api. Following is my api controller.

public class WebsController : ApiController
{
    [HttpPost]
    public void PostOne(string id)
    {
    }

    [HttpPost]
    public void PostTwo(Temp id)
    {
    }
}

I have altered the webapi route to take the action into account. the Temp model look something like this.

public class Temp
{
    public string Id { get; set; }
}

my view look something like this

@using (Ajax.BeginForm(new AjaxOptions
{
    Url = "/api/webs/postone",
    HttpMethod = "post"
}))
{
    <input name="id" id="id" value="2" />
    <input type="submit" value="submit" />
}

the above code does not work at all with the postone unless I put the [FromBody] attribute in front of the parameter like this.

[HttpPost]
public void PostOne([FromBody]string id)
{
}

then it hits the action, but the id is still null. It doesn't get populated with the value in the textbox.

But, if I change the Url of the Ajax.BeginForm to posttwo which take the model Temp, it works nicely and the Id field gets the proper value in the textbox.

can anyone please explain me the reason for this to happen and how I can post a simple value to a web api action? I mean, why can it bind a complex type but not a simple type.

1 comments

@Amila 2015-11-12 08:50:48

It's been quite sometime since I asked this question. Now I understand it more clearly, I'm going to put a more complete answer to help others.

In Web API, it's very simple to remember how parameter binding is happening.

  • if you POST simple types, Web API tries to bind it from the URL
  • if you POST complex type, Web API tries to bind it from the body of the request (this uses a media-type formatter).

  • If you want to bind a complex type from the URL, you'll use [FromUri] in your action parameter. The limitation of this is down to how long your data going to be and if it exceeds the url character limit.

    public IHttpActionResult Put([FromUri] ViewModel data) { ... }

  • If you want to bind a simple type from the request body, you'll use [FromBody] in your action parameter.

    public IHttpActionResult Put([FromBody] string name) { ... }

as a side note, say you are making a PUT request (just a string) to update something. If you decide not to append it to the URL and pass as a complex type with just one property in the model, then the data parameter in jQuery ajax will look something like below. The object you pass to data parameter has only one property with empty property name.

var myName = 'ABC';
$.ajax({url:.., data: {'': myName}});

and your web api action will look something like below.

public IHttpActionResult Put([FromBody] string name){ ... }

This asp.net page explains it all. http://www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api

@gyosifov 2018-10-29 08:59:24

Caution: Will not work! 'public HttpResponseMessage Post([FromBody] int id, [FromBody] string name) { ... }' The reason for this rule is that the request body might be stored in a non-buffered stream that can only be read once.

Related Questions

Sponsored Content

13 Answered Questions

[SOLVED] How to manually send HTTP POST requests from Firefox or Chrome browser?

12 Answered Questions

[SOLVED] How to make an HTTP POST web request

29 Answered Questions

[SOLVED] How do I get ASP.NET Web API to return JSON instead of XML using Chrome?

28 Answered Questions

[SOLVED] How to process POST data in Node.js?

  • 2010-11-28 07:16:28
  • Ming-Tang
  • 918292 View
  • 648 Score
  • 28 Answer
  • Tags:   node.js http-post

16 Answered Questions

[SOLVED] Pass an array of integers to ASP.NET Web API?

3 Answered Questions

[SOLVED] Get the POST data back on Web API

1 Answered Questions

3 Answered Questions

[SOLVED] Web Api and AngularJs

Sponsored Content