Действие отправки формы MVC 4 Ajax всегда публикуется со значениями, отправленными с первой попытки

Я пытаюсь создать простое приложение CRUD. У меня есть частичное представление, которое заполняет строки. В каждой строке есть ссылка «Изменить», по щелчку которой я открываю диалоговое окно jquery. В этом диалоговом окне я загружаю другой частичный вид для редактирования соответствующей строки. На кнопке ok я публикую форму (которая является формой ajax).

Затем контроллер возвращает другое частичное представление, которое должно заменить исходный список (частичное представление списка), потому что я предоставляю updateTargetId (это div, в котором отображается список.

Здесь я сталкиваюсь с двумя проблемами,

  1. Это работает в первый раз (т.е. первый раз в сеансе), когда я публикую форму. Когда я открываю другую запись для редактирования, форма загружается правильно, но когда я ее публикую, форма всегда имеет значения записи, которые публикуются с первой попытки.
  2. Список не обновляется даже после успешной публикации. Я вижу ответ на сообщение в скрипаче. Список обновляется только после обновления браузера.

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

Я думаю, что где-то он кэширует форму. Затем я отключил кеширование, добавив

$.ajaxSetup({ cache: 'false' });

в документе.готово. Это тоже не работает.

Вот код jQuery

this.bindOpenDialog = function () {
    $(".openDialog").click(function (e) {
        e.preventDefault();
        var height = $(this).attr("data-dialog-height");
        var width = $(this).attr("data-dialog-width");
        var data_postUrl = $(this).attr("data-postUrl");
        var data_returnUrl = $(this).attr("data-returnUrl");
        var data_updateTarget = $(this).attr("data-updateTarget");
        var data_form_id = $(this).attr("data-form-id");
        var callBack = $(this).attr("callBack");
        if (data_postUrl == '') {
            data_postUrl = this.href;
        }
        var div = $("<div></div>");
        div.addClass("ui-dialog")
        div.attr("id", $(this).attr("data-dialog-id"))
        var dialog = div.dialog({
            title: $(this).attr("data-dialog-title"),
            close: function () { $(this).remove() },
            height: height,
            width: width,
            modal: true,
            buttons: {
                'Save': function () {
                    var dialog = $(this);
                    var form = null;
                    if (data_form_id == '' || data_form_id == undefined) {
                        form = dialog.find('form').first();
                    }
                    else {
                        form = $("#" + data_form_id).first();
                    }

                    var req = $.post(data_postUrl, form.serialize(),
                        function (responseText, textStatus) {
                        }, "html");
                    req.success(function (data) {
                        if (callBack == '' || callBack == undefined) {
                            dialog.dialog('destroy');
                        }
                        else {
                            var cb = eval(callBack + "()");
                            dialog.dialog('destroy');
                        }
                    });
                    req.success(function (data) {
                        if (callBack == '' || callBack == undefined) {
                            thisDialog.dialog('destroy');
                        }
                        else {
                            var cb = eval(callBack + "()");
                            thisDialog.dialog('destroy');
                        }
                        //remove the form from the DOM.
                        //If I do not do this, it always posts the
                        // form which was posted for the first time.
                        $("#" + data_form_id).remove();
                    });
                    req.error(function (e) {
                        alert('error ' + e.toString())
                    });
                },
                'Cancel': function () {
                    var dialog = $(this);
                    dialog.dialog('destroy');
                }
            }

        });
        dialog.load(this.href);
    }
);

Кто-нибудь уже сталкивался с этой проблемой?

Еще одно мое наблюдение: jQuery не обновляет цель. Я также устанавливаю событие OnSuccess в форме Ajax, которая не срабатывает.


Еще одно мое наблюдение: jQuery не обновляет цель. Я также устанавливаю событие OnSuccess в форме Ajax, которая не срабатывает.


person Mahesh    schedule 10.01.2013    source источник
comment
Не могли бы вы попробовать перезагрузить страницу, нажав кнопку ввода в адресной строке вместо кнопки F5, скажите результат?   -  person user1752474    schedule 11.01.2013
comment
Это тоже не работает :(   -  person Mahesh    schedule 11.01.2013
comment
@BillTheLizard Я должен иметь это в уведомлении, которое я уже добавил в два неответа (дополнительное наблюдение и изменение кода, которое все еще вызывает проблемы) в сам вопрос, извините. знак равно   -  person J. Steen    schedule 26.01.2013


Ответы (3)


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

Теперь мой javascript выглядит так

req.success(
            function (data) {
                if (callBack == '' || callBack == undefined) {
                    thisDialog.dialog('destroy');
                }
                else {
                    var cb = eval(callBack + "()");
                    thisDialog.dialog('destroy');
                }
                //remove the form from the DOM.
                //If I do not do this, it always posts the form which was posted for the first time.
                $("#" + data_form_id).remove();
            }
        );

Может ли кто-нибудь посоветовать, есть ли лучший подход?

С уважением, Махеш

person Mahesh    schedule 13.01.2013

Метод Mark, который возвращает частичные представления (для редактирования и для списка) для редактирования с атрибутом и решением для перестроения:

[OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]
person Alex G.P.    schedule 13.01.2013
comment
Спасибо за ответ Алексей, но это не работает. Я видел, что правильный HTML достигает браузера, т.е. когда я отлаживаю файл cshtml, я вижу там обновленные значения. это браузер, который не отображает эти новые значения. - person Mahesh; 14.01.2013

Хорошо, одним уроком, которым я хотел бы поделиться, я пользуюсь Ajax.BeginForm. Я открываю эту форму в диалоговом окне jquery. В этом диалоговом окне есть кнопки OK и Cancel. При нажатии кнопки «ОК» я отправляю свою форму ajax. по этой причине он не обновляет div. Я публикую эту форму с помощью кнопки «Отправить», она работает.

Итак, обучение таково: если вы используете форму Ajax.Begin, вам нужно опубликовать форму с помощью кнопки отправки, чтобы обновить цель и запустить скрипт в событии OnComplete.

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

Надеюсь, это поможет кому-то.

(Я отмечаю это как ответ, чтобы привлечь внимание к этому сообщению.)

person Mahesh    schedule 15.01.2013