I am trying to submit this with Ajax to a MVC3 controller:
var params = {
'productId': productId,
'list': []
};
$.each($('.specificationId'), function () {
var specId = $(this).attr('id').replace('specification_', '');
var specification = {
specificationId: specId,
articleId: $('#articleid_' + specId).attr('value'),
price: $('#price_' + specId).attr('value'),
stock: $('#stock_' + specId).attr('value'),
stockCount: $('#stockcount_' + specId).attr('value'),
weight: $('#weight_' + specId).attr('value'),
visible: $('#visible_' + specId).attr('checked')
};
params.list.add(specification);
});
console.log(params);
//all values are parsed fine here, shows an array with json objects
$.ajax({
type: "POST",
url: "/Admin/Product/Save/",
data: params,
success: function () { alert('done'); }
});
Now this has to go to the controller like so:
[HttpPost]
public Boolean Save(Int32 productId, Object[] specifications)
{
return true;
}
But Object[] does not work, returns null, I tried all sorts of stuff like lists of a model etc, but it will stay null.
How to tackle this?
ASP.NET MVC 3 includes built-in JSON model binding.
So create simple POCOs which matches the JSON your attempting to submit:
public class ProductJsonModel
{
public int ProductId { get; set; }
public ProductSpecificationJsonModel[] @List { get; set; }
}
public class ProductSpecificationJsonModel
{
public int SpecificationId { get; set; }
public int ArticleId { get; set; }
public double Price { get; set; }
public int Stock { get; set; }
public int StockCount { get; set; }
public int Weight { get; set; }
public bool Visible { get; set; }
}
Then accept that in your action:
[HttpPost]
public Boolean Save(ProductJsonModel model)
As long as the property names in the JSON object match the property names in the POCO's, MVC will bind for you.
Also - you should serialise the JSON using .stringify
or something similar, and set the contentType
of the $.ajax
object accordingly.
Try changing your controller action to (I'm assuming here that Specification is a model representing the JSON you're trying to post):
public Boolean Save(Int32 productId, List<Specification> specifications)
And then change these things in your JS:
var params = {
'productId': productId,
'specifications': []
};
params.specifications.add(specification);
$.ajax({
type: "POST",
url: "/Admin/Product/Save/",
data: JSON.stringify(params),
contentType: 'application/json',
success: function () { alert('done'); }
});
jQuery .ajax()
converts the JSON object to a collection of key value pairs in the application/x-www-form-urlencoded
content type. You can read a good explanation of this in the blog post and comments of POSTing JSON Data to MVC Controllers
So, You should either create a custom ModelBinder or put FormCollection form
as the parameter instead of Object[]
. The FormCollection
will give you a NameValueCollection
of the Form's values that also implements IValueProvider
. You can loop through the collection and all your data will be there.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With