Проводка массива объектов JSON в метод действия MVC3 через jQuery ajax

Не связывает ли модель связующее множество массивов объектов JSON? Приведенный ниже код работает при отправке одного объекта домена JSON как часть сообщения ajax. Однако при отправке массива объектов домена JSON параметр действия имеет значение 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)
{
    ...

Любые идеи, если это возможно?

ИЗМЕНИТЬ

@Milimetric

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

Я на самом деле создаю массив, затем взаимодействую с некоторыми элементами 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');
                    }
                });

Ответ 1

Вам нужно:

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

Ответ 2

У меня была аналогичная проблема. Чтобы решить эту проблему, я принял несколько иной подход. Вместо объекта 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;
}

И затем отправьте serlialized form

$(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');
    }
});