MVC 3: почему jquery form.serialize не собирает все элементы управления в моей форме? - PullRequest
0 голосов
/ 16 марта 2011

Я пытаюсь создать ситуацию, когда, если пользователь нажимает кнопку «редактировать» в списке текстовых элементов, он может редактировать этот элемент.Я пытаюсь заставить кнопку «редактировать» отправлять сообщения обратно, используя ajax.

Вот мой код ajax:

    $(function () {
        // post back edit request
        $('input[name^="editItem"]').live("click", (function () {
            var id = $(this).attr('id');
            var sections = id.split('_');
            if (sections.length == 2) {
                var itemID = sections[1];
                var divID = "message_" + itemID;
                var form = $("#newsForm");
                $.post(
                    form.attr("action"),
                    form.serialize(),
                    function (data) {
                        $("#" + divID).html(data);
                    }
                );
            }
            return false;
        }));
    });

Но команда form.serialize () не принимает все формыэлементы управления в форме.Это ТОЛЬКО сбор скрытого поля формы, которое появляется для каждого элемента в списке.

Вот код в представлении внутри цикла, который отображает все элементы:

 **** this is the only control being picked up: ******
 @Html.Hidden(indexItemID, j.ToString())
 ****
 <div class="datetext" style="float: right; margin-bottom: 5px;">
      @Model.newsItems[j].datePosted.Value.ToLongDateString()
 </div>
 @if (Model.newsItems[j].showEdit)
 {
    // *********** show the editor ************
    <div id="@divID">
    @Html.EditorFor(model => model.newsItems[j])
    </div>
 }
 else
 {
    // *********** show the normal display, plus the following edit/delete buttons *********** 

    if (Model.newsItems[j].canEdit)
    {
         string editID = "editItem_" + Model.newsItems[j].itemID.ToString();
         string deleteID = "deleteItem_" + Model.newsItems[j].itemID.ToString();
         <div class="buttonblock">
            <div style="float: right">
                <input id="@editID" name="@editID" type="submit" class="smallsubmittext cancel" title="edit this item" value="Edit" />
            </div>
            <div style="float: right">
                <input id="@deleteID" name="@deleteID" type="submit" class="smallsubmittext cancel" title="delete this item" value="Delete" />
            </div>
        </div>
        <div class="clear"></div>
    }

Он не собирает ничего, кроме последовательности скрытых полей формы (indexItemID).Почему бы не подхватить элементы управления кнопки?

(Между прочим, идентификаторы элементов управления кнопки редактирования находятся в форме "editItem_x", где x - это идентификатор элемента. Таким образом, элементы управления кнопкиявляются центральными для всего процесса - вот как я выясняю, какой элемент пользователь хочет отредактировать.)

ОБНОВЛЕНИЕ Ответ, похоже, находится в самом jquery API, http://api.jquery.com/serialize/:

«Значение кнопки отправки не сериализуется, так как форма не была отправлена ​​с помощью кнопки.»

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

ОБНОВЛЕНИЕ 2

Я говорил слишком рано - ajaxне работает, чтобы обновить мой частичный вид.Это дает мне исключение, потому что один из разделов на моей странице макета не определен.Я сдаюсь - я не могу больше тратить время на это.Нет Ajax для этого проекта.

1 Ответ

0 голосов
/ 16 марта 2011

Вы можете попробовать:

var form = $('#newsForm *'); // note the '*'

Обновление

Вы также изменили аргумент на $.post()? Я думаю, что, возможно, я был слишком прост в своем ответе. Просто измените аргумент second в $.post(), продолжая использовать form.attr('action')

Новый пост должен выглядеть так:

$.post(
    form.attr("action"),
    $('#newsForm *').serialize(), // this line changed
    function (data) {
        $("#" + divID).html(data);
    }
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...