Диалоговое окно jQuery + ajax - дублирование данных при втором представлении, странное поведение? - PullRequest
2 голосов
/ 11 октября 2011

Я использую MVC 3 с диалоговым окном jquery n $ .ajax.

Я получил 1 View (Index.cshtml) с «кнопкой Создать» и сценарием, как показано ниже:

    // Once generate is clicked, call GenerateList action
    $('#generate').click(function () {
        $.ajax({
            async: false,
            url: '/Shop/GenerateList',
            type: 'GET',
            success: function (result) { getShopListFood(result); }
        });
    });

getShopListFood - это просто действие контроллера, которое возвращает частичное представление:

   // Function to generate shopListFood items based on shopListID
    public ActionResult GetShopListFood(int shopListID)
    {
        var shopListFood = (from f in dbEntities.SHOPLISTFOODs where f.ShopListID == shopListID select f).ToList();
        return PartialView("_ShopList", shopListFood);
    }

Затем в частичном представлении я создаю диалоговое окно для загрузки другого частичного представления, которое является формой для создания нового экземпляра БД: var $ creatialog = $ (''). load ('/ Shop / GetShopListFoodForm'). dialog ({ autoOpen: false, title: 'Добавить новый элемент', модальный: правда });

    $createdialog.dialog("option", "buttons", {
        "Cancel": function () {
            $createdialog.dialog('close');

        },
        "Submit": function () {

            var frm = $('#formData');
            $.ajax({
                async: false,
                url: '/Shop/AddItem',
                type: 'POST',
                data: frm.serialize(),
                success: function (result) {
                    $('.shoplistfood').html(result);
                    $createdialog.dialog('close');
                }
            });

        }
    });

    $('#additem').button().click(function () {
        // Once clicked, create a dialog to load _ShopListFoodForm dialog
        //clear();
        $createdialog.dialog('open');

    });

Однако у меня очень странная ситуация. 2-е создание будет просто дублировать данные в качестве 1-го. Например, я создаю ADD1 и отправляю, список магазинов обновляется, затем я ввожу ADD2 в диалоге формы и подтверждаю, что вместо действия ADD2 я получаю еще один ADD1 POST вместо действия.

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

Надеюсь, я прояснил проблему и могу получить некоторую помощь здесь ...

Действительно ценю это ..............

Ответы [ 2 ]

1 голос
/ 12 октября 2011

Я как-то "решаю" это путем изменения потока. Я превращаю ShopList в View, и каждый раз, когда пользователь добавляет элемент / удаляет элемент, я обновляю div другим частичным представлением _ShopList.

    $createdialog.dialog("option", "buttons", {
        "Cancel": function () {

            $createdialog.dialog('close');

        },
        "Submit": function () {

            var frm = $('#shopform');
            $.ajax({
                url: '/Shop/AddItem',
                type: 'POST',
                data: frm.serialize(),
                success: function (result) {
                    $('#shopfoods').html(result);
                    $createdialog.dialog('close');
                }
            });

        }
    });

Это работает, хотя я не совсем уверен, почему это так. Просто чтобы поделиться своим путем и надеюсь получить обратную связь здесь ... Спасибо !!

0 голосов
/ 23 ноября 2015

У меня была та же проблема, и после нескольких проб и ошибок я понял, что виновником было объявление диалога jquery ui. Объект диалога был объявлен как глобальная переменная в частичном представлении, которое было перезагружено после успешной отправки формы. Перезагруженное частичное представление снова объявляет ту же глобальную переменную и, следовательно, приводит к беспорядку: вы действительно снова отправляете исходный объект - все еще в области видимости.

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

...