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