Я работаю над проектом .NET MVC 3, где я загрузил все представления, основанные на form
, в модальном диалоговом окне, используя jQuery.
Все мои представления загружаются с использованием ajax по всему проекту.
У меня есть функция jQuery, которую я вызываю для любого события щелчка по ссылке, которое выбирает данный URL-адрес (из вида на основе формы, такого как редактирование, добавление и т. Д.) И отображает его в модальном диалоговом окне следующим образом:
function getFormInModal(url_location, modalWidth, modaltitle, tab) {
var url = url_location;
var dialogDiv = $('<div style="display: none;"></div>').appendTo('body');
dialogDiv.load(url, function () {
//Enable the client side validation
var $form = $('form', dialogDiv);
$.validator.unobtrusive.parse($form);
var buttons = {
"Submit": function () {
//Create a validation summary container
var valSummary = ModalForms.validationSummary();
valSummary.setup($form);
if ($form.valid()) {
var postUrl = $form.attr('action');
var formData = $form.serialize();
jQuery.ajax({
url: postUrl,
type: 'POST',
data: formData,
complete: function (data) {
dialogDiv.dialog('close');
refresh(tab);
$.jGrowl("Submitted Successfully.", { life: 2000 });
},
error: function (jqXHR, textStatus, errorThrown) {
var data = jQuery.parseJSON(jqXHR.responseText);
if (data && data.errors) {
valSummary.addErrors(data.errors);
}
}
});
}
},
Cancel: function () {
dialogDiv.dialog('close');
$("html,body").css("overflow", "auto");
}
};
//Load up the dialog
dialogDiv.dialog({
autoOpen: true,
modal: true,
title: modaltitle,
draggable: false,
resizable: false,
buttons: buttons,
width: modalWidth,
close: function () {
$(this).remove();
},
open: function (event, ui) {
$("html,body").css("overflow", "hidden");
}
});
});
}
Моя проблема в функции success
кнопки submit
на модале.
Он делает 3 вещи:
1. Закрывает диалог модальной формы
2. Уведомляет пользователя, что POST
был успешным
3. Обновляет содержимое в определенном DIV
посредством вызова другой простой функции refresh()
.
function refresh(tabname) {
if (tabname == "dashboard") {
$("#dashboard-tab").load("/Sales/Home/Reports");
$("#tabs").tabs("select", 0);
}
if (tabname == "leads") {
$("#leads-tab").load("/Sales/Lead/Index");
$("#tabs").tabs("select", 1);
}
if (tabname == "retail") {
$("#retail-tab").load("/Sales/Retail/Index");
$("#tabs").tabs("select", 2);
}
if (tabname == "corporate") {
$("#corporate-tab").load("/Sales/Corporate/Index");
$("#tabs").tabs("select", 3);
}
}
Теперь отдельно я подключил некоторые события в DOM ready, которые обрабатывают мой статус вызова ajax, следующим образом:
$("#loading").dialog({
autoOpen: false,
modal: true,
width: '450px',
title: 'Patience is a virtue!',
resizable: false,
draggable: false
});
$("#loading").ajaxStart(function () {
$("#loading").dialog('open');
$("html,body").css("overflow", "hidden");
});
$("#loading").ajaxSuccess(function () {
$("#loading").dialog('close');
$("html,body").css("overflow", "auto");
});
$("#loading").ajaxError(function (event, jqXHR, ajaxSettings, thrownError) {
$("#loading").dialog('close');
$.jGrowl(html(thrownError.toString()), { life: 2000 });
});
все отлично работает -
- Я нажимаю на ссылку
- Я вижу модальный диалог #loading
- Он загружается и #loading
закрывается, а dialogDiv
открывается
- Я нажимаю «Отправить», и #loading
открывается поверх dialogDiv
- Когда это будет сделано и близко, и я получаю уведомление jGrowl
Последний шаг, который заключается в загрузке контента, также происходит, однако, как только мой POST завершен, и сделан вызов .load()
для обновления контента, модальный #loading
больше не отображается.
В принципе, .ajaxStart()
не стреляет. Я не знаю почему.
Сначала я написал функцию success
для сообщения ajax, сделанного в событии нажатия кнопки отправки. Тогда я понял, что complete
может быть лучше.
Даже сейчас, когда я вызываю refresh () и, следовательно, .load()
после завершения единственного другого живого .ajax()
вызова, .ajaxStart()
не работает.
Может кто-нибудь, пожалуйста, помогите !!