通过jQuery ajax将JSON对象数组发布到MVC3操作方法

通过jQuery ajax将JSON对象数组发布到MVC3操作方法,jquery,ajax,json,asp.net-mvc-3,Jquery,Ajax,Json,Asp.net Mvc 3,模型绑定器不支持JSON对象的数组吗?以下代码在作为ajax post的一部分发送单个JSON域对象时起作用。但是,在发送JSON域对象数组时,action参数为null var domains = [{ DomainName: 'testt1', Price: '19.99', Available: true

模型绑定器不支持JSON对象的数组吗?以下代码在作为ajax post的一部分发送单个JSON域对象时起作用。但是,在发送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)
{
    ...
你需要:

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) {
                    ...
                }
            });
通常,在调试器中查看请求对象,您将看到传递的内容,并了解如何“说出”HTTP

注意:刚刚发现这个。模型绑定器会阻塞可为空的十进制属性,例如:

public decimal? latitude { get; set; }
因此,如果您使用如下所示的json字符串发布,它将不会绑定:

{"latitude":12.0}
{"latitude":"12.0"}
但如果你发布这样的内容,它会起作用:

{"latitude":12.0}
{"latitude":"12.0"}

请参阅:

我也有类似的问题。为了解决这个问题,我采取了稍微不同的方法。我没有使用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;
}

感谢您的回答和正确的解决方案,但是我已经更新了我的问题k,编辑了我的答案,我认为关键是JSON.stringify和contentType:“application/JSON…”模型绑定器实际上非常智能。它可以绑定一个复杂的对象,就像你扔给它一样。复杂实体列表中的列表?没问题。我很满意。只需稍加润滑,您甚至可以制作一个层次结构表单,允许在整个层次结构中编辑和添加实体。+1很好的解决方案(尽管您不需要
传统:true
,因为您的数据只是
JSON.stringify(…)之后的
字符串
传统的
选项仅用于序列化复杂对象)。+1当您不想将内容类型设置为“application/json”相关时,这尤其有用-