ASP.Net MVC 3 - привязка модели JSON к массиву - PullRequest
17 голосов
/ 12 марта 2011

Я нахожусь на 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 объектами - это означает, что свойства нулевые, но длина аргумента скидок равна 3.

Ответы [ 3 ]

14 голосов
/ 15 марта 2011

Как Cresnet Fresh справедливо указал в комментариях к вопросу, что свойства модели должны быть помечены как общедоступные.

Таким образом, изменение класса Discount, как показано ниже, решило это.

public class Discount
{
    public string Sku{get; set;}
    public string DiscountValue{get; set;}
    public string DiscountType{get; set;}

}
11 голосов
/ 02 июня 2013

пока @ thanikkal ответил на этот конкретный вопрос, у меня были те же симптомы и очень похожая настройка.

вместо public или { get; set; } в моих моделях, вызывающих модельпривязка к не работает это был мой метод jQuery !(RAWR!)

Я использовал $.post (который не работал) вместо $.ajax.


Не работает:

$.post("/Games/Action",
   { "userId": "1", "listName": [ { "fooId": "2", "barId": "99" } ] },
   'json',
   true
  );

Значения находятся в Form.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);
        }
    });

Все значения сопоставлены правильно.


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

0 голосов
/ 12 марта 2011

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

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

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

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

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

...