ASP .NET JQuery проверяющий список очистки полностью раскрывающийся на AJAX отправить с заменой - PullRequest
0 голосов
/ 21 марта 2019

Я боролся с этой проблемой уже несколько дней. Сценарий:

У меня есть форма с разделом общей информации (GI) вверху и частичное представление с таблицей позиций. Приходит пользователь и нажимает кнопку «Добавить элемент строки», появляется модальное окно с большим количеством элементов формы и после отправки заполнение таблицы. Некоторые поля в разделе GI должны быть заполнены, в том числе выпадающее меню (выбор одного пункта из меню).

Теперь, если пользователь входит и заполняет информацию, как и ожидалось, при посещении страницы, все работает нормально. Однако не каждый пользователь использует страницу, как ожидается.

Если пользователь заходит на страницу и сразу нажимает кнопку ОТПРАВИТЬ, страница корректно проверяется. Но если в том же «сеансе» они вводят позицию, возникает проблема. Как только они отправляют позицию, она добавляется в таблицу, и проверка удаляет сообщения, а также непреднамеренно удаляет все элементы из раскрывающегося списка в разделе GI.

То, как работает эта страница (это устаревший код, я его не создавал), когда пользователь заполняет модальное состояние, проверяет входные данные, помечает действие страницы как «добавление» и выполняет функцию отправки jquery. , Функция submit проверяет, что это дополнение, проверяет модальные входы, затем использует ajax для отправки в контроллер и возвращает обновленный частичный фрагмент таблицы, который содержит данные таблицы и заменяет таблицу на странице.

функция отправки:

    if(thisForm.valid() && (hasLineItems || (submitFromModal || deleteItem))){
    var form = e.target;
    if(form.getAttribute('encType') === 'multipart/form-data'){
        if(form.dataset.ajax){
            e.preventDefault();
            e.stopImmediatePropagation();
            var xhr = new XMLHttpRequest();
            xhr.open(form.method, <containerForUrl>),
            xhr.onreadystatechange = function{
                if(xhr.readyState === 4 && xhr.status === 200){
                    $("#PValidationTop").hide();
                    $(".field-validation-error).empty();
                    $(".input-validation-error).empty();
                    var validator = $("#pageForm").validate();
                    validator.resetForm();
                    if(form.dataset.ajaxUpdate){
                        var updateTarget = document.querySelector(form.dataset.ajaxUpdate);
                        if(updateTarget){     
                            $(form.dataset.ajaxUpdate).replacewith(xhr.responseText);
                        }
                        if(form.dataset.ajaxBegin){
                            window[form.dataset.ajaxBegin]();
                        }
                    }

                    if(form.dataset.ajaxSuccess){
                        var args = JSON.parse(xhr.responseText);
                        window[form.dataset.ajaxSuccess](args);
                    }
                } else if(xhr.readyState === 4){
                    if(form.dataset.ajaxFailure){
                        window[form.dataset.ajaxFailure]();
                    }
                }
                if(xhr.readyState === 4){
                    if(form.dataset.ajaxComplete){
                        window[form.dataset.ajaxComplete]();
                    }
                }
            };
            xhr.send(new FormData(form));
        }
    }
}else{
    e.preventDefault();
    e.stopImmediatePropagation();
    thisForm.validate().form();
}

Модальное Представление:

function submitModalPage(){
    if($("#pageAction").val() === 'submit'){
        $("#pageAction").val('new');
    }
    <setting hiddens and other stuff here>
    TP.modal.validate();
    submitFromModal = true;
    $("#pageForm").submit();
    submitFromModal = false;
}

файл скрипта:

function TPModal(validationClass){
    this.validation = validationClass;
    this.validate = function(callback){
        if(callback === 'function') callback();
    }
    this.validation.GI.disableValidation();
}
function ThisPage(validationClass){
    this.validation = validationClass;
    this.modal = new TPModal(this.validation);
    this.validate = function(event, lineItemCount){
        if(lineItemCount > 0){
            this.validation.GI.enableValidation();
            $("#LineItemValidationTable").hide();
            return true;
        }
        else{
            $("#LineItemValidationTable").show();
            event.preventDefault();
            return false;
        }
    };
}

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

View

@using(Ajax.BeginForm(null, null, null, new AjaxOptions()
{
    UpdateTargetId = "replace_me",
    InsertionMode = Insertionmode.Replace,
    HttpMethod = "POST",
    Url = <containerDataUrl>,
    OnBegin = "onAdd"
}, new {id = "pageForm", class="form-horizontal", enctype="multipart/form-data"}))
    {...}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...