使用ASP.NET MVC ActionResult的jQuery Sortable .toArray

时间:2010-03-27 00:28:30

标签: jquery asp.net-mvc

今晚第三次尝试修复此问题 - 尝试采用与现在不同的方法。

给出一个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'参数为空。有什么想法吗?

3 个答案:

答案 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 }

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