通过jQuery ajax将JSON对象数组发布到MVC3操作方法
模型绑定器不支持JSON对象的数组吗?以下代码在作为ajax post的一部分发送单个JSON域对象时起作用。但是,在发送JSON域对象数组时,action参数为null通过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
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”相关时,这尤其有用-