ASP.Net привязка модели MVC 3-JSON к массиву
Я на ASP.Net MVC 3, и идя по списку функций, поддерживаемому в at, я должен иметь возможность получить привязку модели json по умолчанию, работающую из коробки. Однако мне не удалось связать массив / коллекцию из json с параметром метода действия. Хотя я получил простую привязку объекта json, работающую правильно. Был бы очень признателен, если бы эксперт здесь мог сказать мне, что я делаю неправильно.
вот код:
код на стороне сервера первый:
//Действий Методом
public JsonResult SaveDiscount(IList<Discount> discounts)
{
foreach(var discount in discounts)
{
....
}
}
//взгляд модель
public class Discount
{
string Sku{get; set;}
string DiscountValue{get; set;}
string DiscountType{get; set;}
}
/ / сторона клиента (jquery/js):
var discount = {};
var jsondatacoll = [];
$('#discountgrid tr').each(function () {
sku = $(this).find("td").eq(1).html();
discValue = $(this).find('.discval').val();
discType = $(this).find('.disctype').val();
discount = { Sku: sku, DiscountType: discType, DiscountValue: discValue};
jsondatacoll.push(discount);
}
})
if (jsondatacoll.length > 0) {
var catalogDiscount = JSON.stringify(jsondatacoll);
$.ajax(
{
url: '/url/savediscount',
type: 'POST',
data: catalogDiscount,
dataType: 'json',
contentType: 'application/json; charset=utf-8',
success: function (data, textStatus, jqXHR) {
...
},
error: function (objAJAXRequest, strError) {
...
}
}
); //ajax
}
Я проверил полезную нагрузку json в fiddler, и это выглядит следующим образом:
[
{"Sku":"sku1","DiscountType":"type1","DiscountValue":"10"},
{"Sku":sku2","DiscountType":"type1","DiscountValue":"12"},
{"Sku":"sku3","DiscountType":"type2","DiscountValue":"40"}
]
и на стороне сервера я не вижу IList<Discount>
скидки были заполнены 3 пустыми Discount
objects-то есть свойства имеют значение null, но длина аргумента discounts равна 3.
3 ответов
As Cresnet Свежие правильно указано в комментариях к вопросу, что свойства модели должны быть отмечены как общедоступные.
поэтому изменение Discount
класс, как показано ниже, решить эту.
public class Discount
{
public string Sku{get; set;}
public string DiscountValue{get; set;}
public string DiscountType{get; set;}
}
пока @thanikkal отвечал на этот конкретный вопрос, у меня были те же симптомы и очень похожие настройки.
вместо public
или { get; set; }
в моих моделях, вызывающих привязку модели, чтобы не работать, это было на самом деле мое jQuery способ! (О!)
Я был с помощью $.post
(что не сработало) вместо $.ajax
.
не работает:
$.post("/Games/Action", { "userId": "1", "listName": [ { "fooId": "2", "barId": "99" } ] }, 'json', true );
значения в Форма.Data [], но не отображаются должным образом.
работает:
$.ajax( { url: '/Games/Action', type: 'POST', data: JSON.stringify({ userId: "1", listName: [ { fooId: 2, barId: 99 } ] }), dataType: 'json', contentType: 'application/json; charset=utf-8', success: function (data, textStatus, jqXHR) { console.log(data); }, error: function (objAJAXRequest, strError) { console.log(data); } });
все значения отображаются правильно.
потерял несколько часов для этого, надеюсь, это поможет другим.
ваш код выглядит нормально.. Но проверьте это
- настройки маршрутизации.
- поместите атрибут [HttpPost] в SaveDiscount
и попробуйте это
var catalogDiscount = JSON.stringify( { discounts: jsondatacoll } );
это даст правильную привязку данных.