使用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 始终返回Null?

在jQuery 1.4中,他们改变了参数编码的方式。 设置传统:true修复错误。

你可以尝试使用

 data: { 'items[]': items } 

由于项目是一个数组,这是一个半猜测,但我认为这很重要,值得一试:)