Я боролся с этой проблемой уже несколько дней. Сценарий:
У меня есть форма с разделом общей информации (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"}))
{...}