jQuery posts null instead of JSON to ASP.NET Web API

后端 未结 5 738
南笙
南笙 2020-12-05 19:12

I can\'t seem to get this to work... I have some jQuery like this on the client:

$.ajax({
    type: \"POST\",
    url: \"api/report/reportexists/\",
    data         


        
相关标签:
5条回答
  • 2020-12-05 19:49

    So I found the problem, and the solution. So, first thing first. The contentType cannot be 'application/json', it has to be blank (default to application/x-www-form-urlencoded I believe). Although it seems you have to SEND json, but without a name in the name value pair. Using JSON.stringify also messes this up. So the full working jQuery code is like this:

    $.ajax({
        type: "POST",
        url: "api/slideid/reportexists",
        data: { "": reportpath },
        success: function(exists) {
            if (exists) {
                fileExists = true;
            } else {
                fileExists = false;
            }
        }
    });
    

    On the Web.API side, you MUST have the [FromBody] attibute on the parameter, but other than this it's pretty standard. The real problem (for me) was the post.

    In Fiddler, the request body looked like this "=%5C%5Croot%5Cdata%5Creport.html"

    This post really had the answer, and linked to this article which was also very helpful.

    0 讨论(0)
  • 2020-12-05 19:51

    If you're using MVC's FromBody attribute, the MVC binder treats this as an optional parameter. This means you need to be explicit about the Parameter names even if you've only got a single FromBody parameter.

    You should be able to work with something as simple as this:

    Controller:

    [HttpPost]
    public bool ReportExists( [FromBody]string report )
    {
        bool exists = File.Exists(report);
        return exists;
    }
    

    Javascript:

    $.ajax({
        type: "POST",
        url: "api/report/reportexists/",
        data: { "report":reportpath },
        success: function(exists) {
        ...
    

    You must ensure that your data object in jQuery matches the parameter names of your Controllers exactly.

    0 讨论(0)
  • 2020-12-05 19:52

    $.post served the purpose for me. Remove the [FromBody] from webapi and give the url in the url parameter of the $.post in jquery client. It worked!

    0 讨论(0)
  • 2020-12-05 20:05

    This worked for me, all other approaches didn't:

    function addProduct() {
            var product = { 'Id': 12, 'Name': 'Maya', 'Category': 'newcat', 'Price': 1234 };             
            $.ajax({
                type: "POST",
                url: "../api/products",
                async: true,
                cache: false,
                type: 'POST',
                data: product,
                dataType: "json",
                 success: function (result) {
    
                },
                error: function (jqXHR, exception) {
                    alert(exception);
                }
            });
        }
    

    Serverside:

     [HttpPost]
        public Product[] AddNewProduct([FromBody]Product prod)
        {
            new List<Product>(products).Add(prod);
            return products;
        }
    
    0 讨论(0)
  • 2020-12-05 20:12

    jQuery.ajax() by default sets the contentType to be application/x-www-form-urlencoded. You could send the request in application/json instead. Also, you should send your data as a string and it will get model bind to the report parameter for your post method:

    $.ajax({
        type: "POST",
        url: "api/report/reportexists/",
        contentType:  "application/json",
        data: JSON.stringify(reportpath),
        success: function(exists) {
            if (exists) {
                fileExists = true;
            } else {
                fileExists = false;
            }
        }
    });
    
    0 讨论(0)
提交回复
热议问题