今晚第三次尝试修复此问题 - 尝试采用与现在不同的方法。
给出一个jQuery可排序列表..
<ul id="sortable1" class="connectedSortable">
<li class="ui-state-default" id="item1">Item 1</li>
<li class="ui-state-default" id="item2">Item 2</li>
<li class="ui-state-default">Item 3</li>
<li class="ui-state-default ">Item 4</li>
<li class="ui-state-default">Item 5</li>
</ul>
<ul id="sortable2" class="connectedSortable">
</ul>
ASP.NET MVC ActionResult ..
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Insert( string[] items )
{
return null;
}
由JavaScript激活......
$("#sortable1, #sortable2").sortable({
connectWith: '.connectedSortable',
dropOnEmpty: true,
receive: function () {
var items = $(this).sortable('toArray');
alert(items);
$.ajax({
url: '/Manage/Events/Insert',
type: 'post',
data: { 'items': items }
});
}
}).disableSelection();
'警报'会显示正确的项目。它显示'item1,item2'等。但是我的ASP.NET MVC ActionResult什么都没得到。该方法已触发,但'items'参数为空。有什么想法吗?
答案 0 :(得分:3)
我知道这是事后的事,但我偶然发现了这个问题,然后我找到了真正的答案:
AJAX Post of JavaScript String Array to JsonResult as List<string> Always Returns Null?
在jQuery 1.4中,他们改变了参数编码的方式。设置传统:true修复错误。
答案 1 :(得分:2)
看起来在jQuery 1.4.2中解决了序列化问题(参见related question)。
原始答案:
我找到了答案,但你很可能不喜欢它=)。
查看Phil Haack博客上的form post example,只要您的输入元素都具有相同的名称,它们就会被放入列表中。我尝试将字符串数组映射到一个对象数组,如下所示:
var items = $.map(
$(this).sortable('toArray'),
function(item, index){
return {"item": item};
}
);
$.ajax({
url: '/Home/Insert',
type: 'post',
data: { items: items }
});
当我做提交时,我得到了一个正确长度的非null数组,但每个单元格都为空。问题是(根据萤火虫的说法)POST params看起来像这样:
items[0][item] item1
items[1][item] item2
这接近我想要的,但不完全在那里。我真正想提交的内容是这样的:
items item1
items item2
因为这基本上是Phil的例子中的形式。我不知道如何让JSON像这样序列化,所以我欺骗并手动创建了字符串:
$.ajax({
url: '/Home/Insert',
type: 'post',
data: 'items=items1&items=items2'
});
这很有用。当我检查动作中items
数组的值时,它有两个字符串“item1”和“item2”。因此,看起来您可以通过手动序列化数据(可以这么说)并使用字符串作为ajax调用中的参数来使代码工作。不知怎的,这感觉就像是错误的方式,所以我希望有人用一种感觉更好的方式纠正我。
答案 2 :(得分:0)
您可以尝试使用
data: { 'items[]': items }
由于项目是一个数组,这是一个半猜测,但我认为这很重要,值得一试:)