Отправка массива объектов JSON в метод действия MVC3 через jQuery ajax - PullRequest
11 голосов
/ 17 мая 2011

Связыватель модели не поддерживает массивы объектов JSON?Приведенный ниже код работает при отправке одного объекта домена JSON как части сообщения ajax.Однако при отправке массива доменных объектов JSON параметр action имеет значение null.

     var domains = [{
                        DomainName: 'testt1',
                        Price: '19.99',
                        Available: true
                    }, {
                        DomainName: 'testt2',
                        Price: '15.99',
                        Available: false
                    }];

                $.ajax({
                    type: 'POST',
                    url: Url.BasketAddDomain,
                    dataType: "json",
                    data: domains,
                    success: function (basketHtml) {

                    },
                    error: function (a, b, c) {
                        alert('A problem ocurred');
                    }
            });

Это метод действия:

public ActionResult AddDomain(IEnumerable<DomainBasketItemModel> domain)
{
    ...

Есть идеи, если это возможно?

РЕДАКТИРОВАТЬ

@ Милиметрический

Ваше решение работает!Однако, это моя ошибка, но код, который я продемонстрировал, не является реальным кодом моей проблемы, я пытался показать эквивалентный код, который легче понять.

Я на самом деле создаю массив, затемнекоторые элементы DOM и помещая объект JSON в массив, а затем публикуя этот массив как данные ...

var domains = [];

                $(this).parents('table').find('input:checked').each(function () {
                    var domain = {
                        DomainName: $(this).parent().parent().find('.name').html(),
                        Price: $(this).parent().parent().find('.price span').html(),
                        Available: $(this).parent().parent().find('.available').html() == "Available"
                    }

                    domains.push(domain);
                });

                $.ajax({
                    type: 'POST',
                    url: Url.BasketAddDomain,
                    dataType: "json",
                    data: { domain: domains },
                    success: function (basketHtml) {

                    },
                    error: function (a, b, c) {
                        alert('A problem ocurred');
                    }
                });

Ответы [ 2 ]

32 голосов
/ 17 мая 2011

Вам нужно:

var domains = { domains: [... your elements ...]};

            $.ajax({
                type: 'post',
                url: 'Your-URI',
                data: JSON.stringify(domains),
                contentType: "application/json; charset=utf-8",
                traditional: true,
                success: function (data) {
                    ...
                }
            });

В общем, проверьте объект Request в отладчике, вы увидите, что передается, и получите представление о том, как «говорить» по HTTP.

ПРИМЕЧАНИЕ : Только что это выяснили. Модельный переплет дросселирует обнуляемые десятичные свойства как:

public decimal? latitude { get; set; }

Так что это не будет связывать это, если вы отправляете на него строку json, которая выглядит следующим образом:

{"latitude":12.0}

Но это будет работать, если вы напишите что-то вроде этого:

{"latitude":"12.0"}

См .: http://syper -blogger.blogspot.com / 2011/07 / hello-world.html

1 голос
/ 17 мая 2011

У меня была похожая проблема.Чтобы решить это, я выбрал немного другой подход.Вместо объекта JSON я использовал массивы скрытых переменных формы.Пока имена переменных совпадают, привязка модели работает как шарм.

function AddDomainBasket(domainName, price, available) {

    if ( typeof AddDomainBasket.counter == 'undefined' ) {
        AddDomainBasket.counter = 0;
    }

    $("#some_form").append('<input type="hidden" name="[' + AddDomainBasket.counter + '].DomainName" value="' + domainName_index + '" />');
    $("#some_form").append('<input type="hidden" name="[' + AddDomainBasket.counter + '].Price" value="' + price + '" />');
    $("#some_form").append('<input type="hidden" name="[' + AddDomainBasket.counter + '].Available" value="' + available + '" />');

    ++AddDomainBasket.counter;
}

И затем отправьте сериализованную форму

$(this).parents('table').find('input:checked').each(function () {
    AddDomainBasket($(this).parent().parent().find('.name').html(),
                    $(this).parent().parent().find('.price span').html(),
                    $(this).parent().parent().find('.available').html() ==   "Available");
                }
            });

$.ajax({
    type: 'POST',
    url: Url.BasketAddDomain,
    data: $('#some_form').serialize(),
    success: function (basketHtml) {
        },
        error: function (a, b, c) {
            alert('A problem ocurred');
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...