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

Опитвам се да създам просто CRUD приложение. Имам частичен изглед, който запълва редовете. Във всеки ред има връзка Редактиране, при щракване върху която отварям диалогов прозорец на jquery. В този диалогов прозорец зареждам друг частичен изглед за редактиране на съответния ред. На бутона ok публикувам формуляра (който е ajax формуляр).

След това контролерът връща друг частичен изглед, за който се предполага, че замества оригиналния списък (частичния изглед на списъка), защото предоставям updateTargetId (това е div, в който се изобразява списъкът.

Тук се сблъсквам с два проблема,

  1. Това работи за първи път (т.е. за първи път в сесията), публикувам формуляра. Когато отворя друг запис за редактиране, формулярът се зарежда правилно, но когато го публикувам, формулярът винаги има стойностите на записа, които са публикувани при първия опит.
  2. Списъкът не се актуализира дори след успешно публикуване. Виждам отговора на публикацията във fiddler. Списъкът се обновява само след като обновя браузъра.

Опитах да изчистя 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

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

[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 и Отказ. Щракнете върху Ok Публикувам своя ajax формуляр. това е причината да не актуализира div. Публикувам този формуляр с помощта на бутона за изпращане, работи.

Така че обучението е, че ако използвате формуляр Ajax.Begin, тогава трябва да публикувате формуляра с помощта на бутона за изпращане, за да актуализирате целта и да изпълните скрипта при събитие OnComplete.

Ако изпратите формуляра чрез друг бутон, тогава не можете да се възползвате от това предимство. В този случай трябва да го направите с javascript.

Надявам се това да помогне на някого.

(Маркирам това като отговор, за да привлека вниманието към тази публикация.)

person Mahesh    schedule 15.01.2013