jQuery Сортируемый .toArray с ASP.NET MVC ActionResult - PullRequest
3 голосов
/ 27 марта 2010

Третья попытка исправить это сегодня вечером - попытка другого подхода, чем раньше.

Учитывая сортируемый список 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' имеет значение null. Есть идеи?

Ответы [ 3 ]

3 голосов
/ 07 октября 2010

Я знаю, что это после факта, но я наткнулся на этот вопрос, затем я нашел реальный ответ:

AJAX Post of JavaScript String Array для JsonResult в виде списка Всегда возвращает ноль?

В jQuery 1.4 они изменили способ кодирования параметров. Установка традиционного: true исправляет ошибку.

2 голосов
/ 27 марта 2010

Похоже, что проблема сериализации была решена в jQuery 1.4.2 (см. связанный вопрос ).


Оригинальный ответ:
Я как-то разобрался с ответом, но вам, скорее всего, он не понравится =).

Глядя на пример поста в блоге Фила Хаака, пока все элементы ввода имеют одинаковое имя, они будут внесены в список. Я попытался отобразить массив строк в массив объектов следующим образом:

var items = $.map( 
    $(this).sortable('toArray'),
    function(item, index){
        return {"item": item};
    }
);

$.ajax({
    url: '/Home/Insert',
    type: 'post',
    data: { items: items }
});

и когда я сделал отправку, я получил ненулевой массив правильной длины, но каждая ячейка была нулевой. Проблема заключалась в том, что (согласно Firebug) параметры POST выглядели так:

items[0][item]  item1
items[1][item]  item2

что близко к тому, что я хочу, но не совсем там. Я действительно хотел представить что-то похожее на это:

items   item1
items   item2

потому что это, по сути, то, что делает форма в примере Фила. Я не знаю, как заставить JSON так сериализоваться, поэтому я обманул и создал строку вручную так:

$.ajax({
    url: '/Home/Insert',
    type: 'post',
    data: 'items=items1&items=items2'
});

Это сработало. Когда я проверил значение массива items в действии, в нем было две строки "item1" и "item2". Похоже, вы можете заставить свой код работать, сериализовав данные вручную (если можно так выразиться) и используя строку в качестве аргумента в вашем вызове ajax. Каким-то образом это выглядит как неправильный путь, поэтому я надеюсь, что кто-то исправит меня таким образом, который будет более правильным.

0 голосов
/ 27 марта 2010

вы можете попробовать использовать

data: { 'items[]': items }

, так как элементы - это массив, это предположение, но я думаю, что это имеет значение, и оно того стоит:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...