SimpleModal перерывы ASP.Net Postbacks
Я использую jQuery и SimpleModal в ASP.Net проект, чтобы сделать некоторые хорошие диалоги для веб-приложения. К сожалению, любые кнопки в модальном диалоге больше не могут выполнять свои обратные вызовы, что на самом деле неприемлемо.
есть один источник, который я нашел с решение, но я не могу заставить его работать, в основном потому, что я не полностью понимаю все необходимые шаги.
У меня тоже есть обходной путь, который заключается в замене обратных связей, но он уродлив и, вероятно, не самый надежный. Я бы очень хотел, чтобы отзывы снова заработали. Есть идеи?
UPDATE: я должен уточнить, обратные ссылки не работают, потому что Javascript, используемый для выполнения почтовых спинок, каким-то образом сломался, поэтому ничего не происходит при нажатии кнопки.
10 ответов
вы оба на правильном пути. Я понял, что SimpleModal добавляет диалог к телу, которое находится снаружи ASP.Net s <form>
, который нарушает функциональность, так как он не может найти элементы.
чтобы исправить это, я просто изменил источник SimpleModal, чтобы добавить все в 'form'
вместо 'body'
. Когда я создаю диалог, я также использую persist: true
опция, чтобы убедиться, что кнопки остаются через открытие и закрытие.
спасибо всем за предложения!
обновление: версия 1.3 добавляет appendTo
опция в конфигурации для указания, к какому элементу должен быть добавлен модальный диалог. вот документы.
все стандартные ASP.NET обратные связи работают, вызывая метод javascript __doPostBack на странице. Эта функция представляет форму (ASP.NET только действительно нравится одна форма на страницу), которая включает в себя некоторое скрытое поле ввода, в котором живет все viewstate и другое добро.
на первый взгляд, я не вижу ничего в SimpalModal, что испортило бы форму вашей страницы или любой из стандартных скрытых входов, если только содержимое этого модального не произошло от HTTP ASP.NET страница. Это привело бы к двум ASP.NET формы, отображаемые в один DOM и почти наверняка испортят функцию _ _ doPostBack.
вы рассматривали возможность использования ASP.NET AJAX ModalPopup control?
веб-браузеры не будут публиковать отключенные или скрытые элементы формы.
Итак, что происходит:
- пользователь нажимает кнопку в диалоговом окне.
- кнопка вызывает метод close() SimpleModal, скрывая диалог и кнопку
- клиент публикует форму (без идентификатора кнопки)
- ASP.NET framework не может понять, какая кнопка была нажата
- ваш серверный код не получить выполненный.
решение состоит в том, чтобы сделать все, что вам нужно сделать на клиенте (закрытие диалога в этом случае), а затем вызвать __doPostback() самостоятельно.
например (где " dlg " - ссылка на клиентский SimpleModal dialog):
btn.OnClientClick = string.Format("{0}; dlg.close();",
ClientScript.GetPostBackEventReference(btn, null));
это должно скрыть диалог, отправить форму и вызвать любое серверное событие, которое у вас есть для этой кнопки.
@Dan
все стандартные ASP.NET обратная связь работает вызывая метод javascript __doPostBack на странице.
asp: кнопки не вызывают __doPostback (), потому что элементы управления вводом HTML уже отправляют форму.
попался на этом - большое спасибо tghw и всем другим участникам в форме appendto вместо исправления тела. (разрешено атрибутами в версии 1.3)
btw: если кому - то нужно закрыть диалоговое окно программно из .net-вы можете использовать этот тип синтаксиса
private void CloseDialog()
{
string script = string.Format(@"closeDialog()");
ScriptManager.RegisterClientScriptBlock(this, typeof(Page), UniqueID, script, true);
}
где javascript closedialog похож на это....
function closeDialog() {
$.modal.close();
}
Я нашел следующие работы без изменения simplemodal.js:
function modalShow(dialog) {
// if the user clicks "Save" in dialog
dialog.data.find('#ButtonSave').click(function(ev) {
ev.preventDefault();
//Perfom validation
// close the dialog
$.modal.close();
//Fire the click event of the hidden button to cause a postback
dialog.data.find('#ButtonSaveTask').click();
});
dialog.data.find("#ButtonCancel").click(function(ev) {
ev.preventDefault();
$.modal.close();
});
}
поэтому вместо того, чтобы использовать кнопки в диалоговом окне, чтобы вызвать обратную передачу, вы предотвращаете их отправку, а затем находите скрытую кнопку в форме и вызываете ее событие click.
FWIW, я обновил блоге вы указали на С приходом разъяснения, Перепечатано здесь-рассуждения и другие детали находятся в блоге:
решение (по состоянию на мою последнюю проверку перед обедом):
- переопределите событие onClose диалогового окна и выполните следующие действия:
- вызовите функцию закрытия диалогового окна по умолчанию
- установите для диалогового окна div innerHTML значение single
- Hijack _ _ doPostBack, указывая на новую функцию, newDoPostBack
из некоторых комментариев, которые я видел в интернете, пункт 1 нуждается в некотором разъяснении. К сожалению, я больше не работаю на того же работодателя, и у меня нет доступа к коду, который я использовал, но я сделаю все, что смогу. Во-первых, вам нужно переопределить функцию onclose диалога, определив новую функцию и указав на нее свой диалог, например:
$('#myJQselector').modal({onClose: mynewClose});
- вызов функции закрытия диалогового окна по умолчанию. В функции, которую вы определяете, вы должны сначала вызвать функциональность по умолчанию (лучшая практика для всего, что вы обычно переопределяете):
- установите для диалогового окна div innerHTML значение single – это не обязательный шаг, поэтому пропустите его, если вы этого не понимаете.
- Hijack _ _ doPostBack, указывая на новую функцию, newDoPostBack
function myNewClose (dialog)
{
dialog.close();
__doPostBack = newDoPostBack;
}
- напишите функцию newDoPostBack:
function newDoPostBack(eventTarget, eventArgument) {var theForm = document.forms[0];if (!theForm){theForm = document.aspnetForm;}if (!theForm.onsubmit || (theForm.onsubmit() != false)){document.getElementById("__EVENTTARGET").value = eventTarget;document.getElementById("__EVENTARGUMENT").value = eventArgument;theForm.submit();} }
новый Jquery.simplemodal-1.3.js имеет опцию под названием appendTo. Поэтому добавьте опцию appendTo: 'form', потому что по умолчанию appendTo: 'body' , которая не работает в asp.net - ...
была та же проблема, но {appendTo:'form'}
вызвало модальное всплывающее окно, чтобы быть оказанным полностью неправильно (как будто у меня была проблема CSS).
оказывается, шаблон, который я строю поверх, включает в себя другие формы на странице. Как только я установлю {appendTo:'#aspnetForm'}
(по умолчанию Asp.net form ID), все отлично работало (включая обратную передачу).
в дополнение к ответу tghw, это отличное сообщение в блоге помогло мне:jQuery: исправьте свои отзывы в модальных формах -- в частности, комментарий BtnMike:"вы также не должны иметь CssClass=" simplemodal-close", установленный на вашей кнопке asp:.- Снять это с занятий было для меня неочевидным решением.
-Джон
Если вы не хотите изменять источник SimpleModal. попробовать это..
после вызова метода modal () добавьте следующее:
$("#simplemodal-overlay").appendTo('form');
$("#simplemodal-container").appendTo('form');
плагин SimpleModal добавляет два это к вашей разметке.
- 'simplemodal-overlay' для фона
- 'simplemodal-container' containig div, который вы whant как всплывающее модальное.