Диалог jQuery UI с обратной передачей кнопки ASP.NET - PullRequest
292 голосов
/ 16 апреля 2009

У меня отлично работает диалог jQuery UI на моей странице ASP.NET:

jQuery(function() {
    jQuery("#dialog").dialog({
        draggable: true,
        resizable: true,
        show: 'Transfer',
        hide: 'Transfer',
        width: 320,
        autoOpen: false,
        minHeight: 10,
        minwidth: 10
    });
});

jQuery(document).ready(function() {
    jQuery("#button_id").click(function(e) {
        jQuery('#dialog').dialog('option', 'position', [e.pageX + 10, e.pageY + 10]);
        jQuery('#dialog').dialog('open');
    });
});

Мой div:

<div id="dialog" style="text-align: left;display: none;">
    <asp:Button ID="btnButton" runat="server" Text="Button" onclick="btnButton_Click" />
</div>

Но btnButton_Click никогда не вызывается ... Как я могу это решить?

Дополнительная информация: я добавил этот код, чтобы переместить div в форму:

jQuery("#dialog").parent().appendTo(jQuery("form:first"));

Но все еще безуспешно ...

Ответы [ 17 ]

314 голосов
/ 20 апреля 2009

Вы близки к решению, просто получаете не тот объект. Должно быть так:

jQuery(function() {
    var dlg = jQuery("#dialog").dialog({
                         draggable: true,
                         resizable: true,
                         show: 'Transfer',
                         hide: 'Transfer',
                         width: 320,
                         autoOpen: false,
                         minHeight: 10,
                         minwidth: 10
                     });
    dlg.parent().appendTo(jQuery("form:first"));
});
37 голосов
/ 13 мая 2009
$('#divname').parent().appendTo($("form:first"));

Использование этого кода решило мою проблему, и оно работало во всех браузерах, Internet Explorer 7, Firefox 3 и Google Chrome. Я начинаю любить jQuery ... Это крутой фреймворк.

Я тоже тестировал с частичным рендером, именно то, что искал. Отлично!

<script type="text/javascript">
    function openModalDiv(divname) {
        $('#' + divname).dialog({ autoOpen: false, bgiframe: true, modal: true });
        $('#' + divname).dialog('open');
        $('#' + divname).parent().appendTo($("form:first"));
    }

    function closeModalDiv(divname) {
        $('#' + divname).dialog('close');
    }
</script>
...
...
<input id="Button1" type="button" value="Open 1" onclick="javascript:openModalDiv('Div1');" />
...
...
<div id="Div1" title="Basic dialog" >
    <asp:UpdatePanel ID="UpdatePanel1" runat="server">
       <ContentTemplate>
          postback test<br />
          <asp:Button ID="but_OK" runat="server" Text="Send request" /><br />
          <asp:TextBox ID="tb_send" runat="server"></asp:TextBox><br />
          <asp:Label ID="lbl_result" runat="server" Text="prova" BackColor="#ff0000></asp:Label>
        </ContentTemplate>
    <asp:UpdatePanel>
    <input id="Button2" type="button" value="cancel" onclick="javascript:closeModalDiv('Div1');" />
</div>
34 голосов
/ 12 ноября 2009

FWIW, форма: первая техника у меня не сработала.

Однако, техника в той статье блога сделала:

http://blog.roonga.com.au/2009/07/using-jquery-ui-dialog-with-aspnet-and.html

В частности, добавив это в объявление диалога:

  open: function(type,data) {
    $(this).parent().appendTo("form");
  }
27 голосов
/ 11 мая 2013

Имейте в виду, что в jQuery UI v1.10 есть дополнительная настройка. Добавлен параметр appendTo , который используется для обхода обхода ASP.NET , который используется для повторного добавления элемента в форму.

Попробуйте:

$("#dialog").dialog({
     autoOpen: false,
     height: 280,
     width: 440,
     modal: true,
     **appendTo**:"form"
});
24 голосов
/ 29 января 2010
Ответ

кен выше помог мне. Проблема с принятым ответом состоит в том, что он работает, только если у вас есть один модал на странице. Если у вас есть несколько модальностей, вам нужно сделать это встроенным в параметре «open» при инициализации диалога, а не после факта.

open: function(type,data) { $(this).parent().appendTo("form"); }

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

21 голосов
/ 16 апреля 2009

В первую очередь это связано с тем, что jQuery перемещает диалог за пределы тегов формы, используя DOM . Переместите его обратно в теги формы, и оно должно работать нормально. В этом можно убедиться, проверив элемент в Firefox.

8 голосов
/ 10 ноября 2010

Мне не хотелось обходить эту проблему для каждого диалога в моем проекте, поэтому я создал простой плагин jQuery. Этот плагин предназначен только для открытия новых диалогов и помещения их в форму ASP.NET :

(function($) {
    /**
     * This is a simple jQuery plugin that works with the jQuery UI
     * dialog. This plugin makes the jQuery UI dialog append to the
     * first form on the page (i.e. the asp.net form) so that
     * forms in the dialog will post back to the server.
     *
     * This plugin is merely used to open dialogs. Use the normal
     * $.fn.dialog() function to close dialogs programatically.
     */
    $.fn.aspdialog = function() {
        if (typeof $.fn.dialog !== "function")
            return;

        var dlg = {};

        if ( (arguments.length == 0)
                || (arguments[0] instanceof String) ) {
            // If we just want to open it without any options
            // we do it this way.
            dlg = this.dialog({ "autoOpen": false });
            dlg.parent().appendTo('form:first');
            dlg.dialog('open');
        }
        else {
            var options = arguments[0];
            options.autoOpen = false;
            options.bgiframe = true;

            dlg = this.dialog(options);
            dlg.parent().appendTo('form:first');
            dlg.dialog('open');
        }
    };
})(jQuery);

Таким образом, чтобы использовать плагин, вы сначала загружаете jQuery UI, а затем плагин. Тогда вы можете сделать что-то вроде следующего:

$('#myDialog1').aspdialog(); // Simple
$('#myDialog2').aspdialog('open'); // The same thing
$('#myDialog3').aspdialog({title: "My Dialog", width: 320, height: 240}); // With options!

Для ясности, этот плагин предполагает, что вы готовы показать диалоговое окно при его вызове.

7 голосов
/ 15 декабря 2013

Я знаю, что это старый вопрос, но для тех, у кого такая же проблема, есть более новое и более простое решение: в jQuery UI 1.10.0

была введена опция "appendTo"

http://api.jqueryui.com/dialog/#option-appendTo

$("#dialog").dialog({
    appendTo: "form"
    ....
});
7 голосов
/ 18 мая 2010

Fantastic! Это решило мою проблему с ASP: событие Button не запускалось внутри модального jQuery. Обратите внимание: использование модального интерфейса jQuery со следующим разрешает запуск события кнопки:

// Dialog Link
$('#dialog_link').click(function () {
    $('#dialog').dialog('open');
    $('#dialog').parent().appendTo($("form:first"))
    return false;
});

Следующая строка является ключом, чтобы это заработало!

$('#dialog').parent().appendTo($("form:first"))
3 голосов
/ 09 мая 2013

В ASP.NET просто используйте UseSubmitBehavior="false" в кнопке ASP.NET:

<asp:Button ID="btnButton" runat="server"  Text="Button" onclick="btnButton_Click" UseSubmitBehavior="false" />       

Ссылка: Свойство Button.UseSubmitBehavior

...