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?


веб-браузеры не будут публиковать отключенные или скрытые элементы формы.

Итак, что происходит:

  1. пользователь нажимает кнопку в диалоговом окне.
  2. кнопка вызывает метод close() SimpleModal, скрывая диалог и кнопку
  3. клиент публикует форму (без идентификатора кнопки)
  4. ASP.NET framework не может понять, какая кнопка была нажата
  5. ваш серверный код не получить выполненный.

решение состоит в том, чтобы сделать все, что вам нужно сделать на клиенте (закрытие диалога в этом случае), а затем вызвать __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, я обновил блоге вы указали на С приходом разъяснения, Перепечатано здесь-рассуждения и другие детали находятся в блоге:

решение (по состоянию на мою последнюю проверку перед обедом):

  1. переопределите событие onClose диалогового окна и выполните следующие действия:
    1. вызовите функцию закрытия диалогового окна по умолчанию
    2. установите для диалогового окна div innerHTML значение single
    3. Hijack _ _ doPostBack, указывая на новую функцию, newDoPostBack

из некоторых комментариев, которые я видел в интернете, пункт 1 нуждается в некотором разъяснении.  К сожалению, я больше не работаю на того же работодателя, и у меня нет доступа к коду, который я использовал, но я сделаю все, что смогу.  Во-первых, вам нужно переопределить функцию onclose диалога, определив новую функцию и указав на нее свой диалог, например:

$('#myJQselector').modal({onClose: mynewClose});
  • вызов функции закрытия диалогового окна по умолчанию.  В функции, которую вы определяете, вы должны сначала вызвать функциональность по умолчанию (лучшая практика для всего, что вы обычно переопределяете):
  • установите для диалогового окна div innerHTML значение single – это не обязательный шаг, поэтому пропустите его, если вы этого не понимаете.
  • Hijack _ _ doPostBack, указывая на новую функцию, newDoPostBack
function myNewClose (dialog)
{
    dialog.close();
    __doPostBack = newDoPostBack;
}
  1. напишите функцию 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 добавляет два это к вашей разметке.

  1. 'simplemodal-overlay' для фона
  2. 'simplemodal-container' containig div, который вы whant как всплывающее модальное.