模型绑定器不支持 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');
}
});
你需要:
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
我也有类似的问题。为了解决这个问题,我采取了一种稍微不同的方法。我没有使用 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');
}
});