WebApi 2 POST with single string parameter not working

前端 未结 2 1869
爱一瞬间的悲伤
爱一瞬间的悲伤 2020-12-08 19:40

I have the following controller:

public class ValuesController : ApiController
{
    // POST api/values
    public IHttpActionResult Post(string filterName)         


        
相关标签:
2条回答
  • 2020-12-08 20:13

    Add [FromBody] to the API method signature like public IHttpActionResult Post([FromBody]string filterName) and wrap the ajax data parameter with quotes: data: '"' + bodyContent + '"'.

    Not very intuitive, but it works.

    0 讨论(0)
  • 2020-12-08 20:17

    c#

    public class ValuesController : ApiController
    {
        // POST api/values
        [HttpPost] // added attribute
        public IHttpActionResult Post([FromBody] string filterName) // added FromBody as this is how you are sending the data
        {
            return new JsonResult<string>(filterName, new JsonSerializerSettings(), Encoding.UTF8, this);
        }
    

    JavaScript

    $.ajax(
    {
        url: "/api/Values/", // be consistent and case the route the same as the ApiController
        type: "POST",
        dataType: 'json',
        data: "=Dirty Deeds", // add an = sign
        success: function (result) {
            console.log(result);
        },
        error: function (xhr, status, p3, p4) {
            var err = "Error " + " " + status + " " + p3;
            if (xhr.responseText && xhr.responseText[0] == "{")
                err = JSON.parse(xhr.responseText).message;
            console.log(err);
        }
    });
    

    Explanation

    Because you are only sending a single value add the = sign in front of it so it will be treated like forms encoding. You can also add the content type if you want to make it clear that this is what you are doing to the ajax call.

    contentType: 'application/x-www-form-urlencoded'
    

    Alternatively you could also send the content via URL OR wrap the content in an object on the server as well as in the ajax call and stringify it.

    public class Filter {
        public string FilterName {get;set;}
    }
    
    public class ValuesController : ApiController
    {
        // POST api/values
        [HttpPost] // added attribute
        public IHttpActionResult Post([FromBody] Filter filter) // added FromBody as this is how you are sending the data
        {
            return new JsonResult<string>(filter.FilterName, new JsonSerializerSettings(), Encoding.UTF8, this);
        }
    

    JavaScript

    $.ajax(
    {
        url: "/api/Values/", // be consistent and case the route the same as the ApiController
        type: "POST",
        dataType: 'json',
        contentType: 'application/json',
        data: JSON.stringify({FilterName: "Dirty Deeds"}), // send as json
        success: function (result) {
            console.log(result);
        },
        error: function (xhr, status, p3, p4) {
            var err = "Error " + " " + status + " " + p3;
            if (xhr.responseText && xhr.responseText[0] == "{")
                err = JSON.parse(xhr.responseText).message;
            console.log(err);
        }
    });
    
    0 讨论(0)
提交回复
热议问题