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);
        }
    });

все значения отображаются правильно.


потерял несколько часов для этого, надеюсь, это поможет другим.


ваш код выглядит нормально.. Но проверьте это

  1. настройки маршрутизации.
  2. поместите атрибут [HttpPost] в SaveDiscount

и попробуйте это

var catalogDiscount = JSON.stringify( { discounts: jsondatacoll } );

это даст правильную привязку данных.