Search code examples
jsonajax.net-corehttp-post

Why do I get an empty parameter on the controller in my HttpPost method Ajax call?


I have a view that adds an Unordered list and list items to it at runtime, then I loop through to get the entered values, push the info to an object, and do the Ajax call to my method.

I always get an empty parameter on the controller, the console.log(assetWeighJsonDetail) shows what was entered, so I'm making sure I'm not passing and empty object (see the image below):

// Client side script:

var assetSerialNumber = "";
var weight = 0;
var assetWeighJsonDetail = [];

$(".ul-asset-weigh").each(function () {

    var classNameSelected = this.id;

    $("." + classNameSelected).each(function () {
        assetSerialNumber = $(this).attr('id');
        weight = $(this).val();
        assetWeighJsonDetail.push({
            OriginID: classNameSelected,
            AssetSerialNumber: assetSerialNumber,
            Weight: weight
        });
    });
});

console.log(assetWeighJsonDetail);

$.ajax({
    url: "/AssetWeigh/SaveAssetWeigh",
    data: JSON.stringify({assetWeighJsonDetail}),
    type: "POST",
    dataType: "json",
    contentType: "application/json; charset=utf-8",
    traditional: true,
    success: function (response) {
        if (response) {
            alert("success");
        }
        else {
            alert("fail");
        }
    },
    error: function (exception) {
    }
});

// Console:
screenshot of console output

// Controller Method:

[HttpPost]
public ActionResult SaveAssetWeigh(List<AssetWeighJsonDetail> assetWeighJsonDetail)      
{
   bool success = false;

   success = assetWeighJsonDetail != null && assetWeighJsonDetail.Count > 0;

   return Json(success);
}

// Method's class List parameter:

public class AssetWeighJsonDetail
{
    public int OriginID { get; set; }
    public string AssetSerialNumber { get; set; }
    public decimal Weight { get; set; }
}

Solution

  • You should try with $.post I have faced the same issue if using $.ajax and was not working and just switching to $.post made it work.

    $.post( "/AssetWeigh/SaveAssetWeigh", parameters, function() {
      alert( "success" );
    })
      .done(function() {
     alert( "second success" );
      })
      .fail(function() {
     alert( "error" );
    })
     .always(function() {
     alert( "finished" );
     });
    

    I'm on my phone and can't type all of it, I'll try to update later from my computer