Подтвердить что ты не робот

ASP.Net MVC 3 - привязка модели JSON к массиву

Я нахожусь в ASP.Net MVC 3, и, перейдя по списку функций, поддерживаемому в, я должен иметь возможность получить стандартную привязку json model, работающую из коробки. Однако я havent был успешным в привязке массива/коллекции от 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 в скрипаче, и он выглядит как ниже:

[
    {"Sku":"sku1","DiscountType":"type1","DiscountValue":"10"},     
    {"Sku":sku2","DiscountType":"type1","DiscountValue":"12"}, 
    {"Sku":"sku3","DiscountType":"type2","DiscountValue":"40"}
]

И на стороне сервера я вижу, что скины IList<Discount> были заполнены тремя пустыми объектами Discount, что означает, что свойства имеют значение null, но длина аргумента скидки равна 3.

4b9b3361

Ответ 1

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

Итак, измените класс Discount, как показано ниже.

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

}

Ответ 2

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

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


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

Ответ 3

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

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

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

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

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