Диалог jQuery UI с обратной передачей кнопки ASP.NET

283

У меня есть диалоговое окно 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"));

Но все же без успеха...

  • 0
    LOL ... сначала я думал, что ты украл мой вопрос, но потом я увидел, что ты спросил сначала. Я задавал тот же вопрос для FancyBox - stackoverflow.com/questions/2686362/…
  • 1
    Есть лучший ответ, чем явный вызов appendTo (). Проверьте это stackoverflow.com/a/20589833/2487549
Теги:
postback

17 ответов

293
Лучший ответ

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

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"));
});
  • 0
    Что делать, если для него установлена модальная опция true? в моем случае решение является идеальным, но без модального - с модальным, div, созданный для модального эффекта, помещается в диалог с методом parent ()
37
$('#divname').parent().appendTo($("form:first"));

Использование этого кода решило мою проблему, и оно работало в каждом браузере, Internet 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>
  • 0
    Этот полный пример помог мне собрать воедино то, чего мне не хватало при столкновении с этой проблемой. Спасибо!
35

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

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

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

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

  open: function(type,data) {
    $(this).parent().appendTo("form");
  }
  • 1
    если вы не сделаете это на панели обновления, этот метод - единственный способ заставить мои кнопки (которые я хочу сделать полный постбэк) работать.
  • 0
    +1 для этого это единственный код, который работал для меня. Я не использую панель обновления. БЛАГОДАРЮ ВАС!!! спас мой день!
Показать ещё 2 комментария
26

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

Try:

$("#dialog").dialog({
     autoOpen: false,
     height: 280,
     width: 440,
     modal: true,
     **appendTo**:"form"
});
  • 0
    Это не работает для меня с 2 jquery диалогами на одной странице. Я хотел бы, чтобы это было, поскольку это правильное решение.
  • 3
    Методы parent (). AppendTo ("form") не работали с модальным диалогом, потому что div оверлея остается вне формы и в конечном итоге закрывает диалог (делая его неработоспособным). Используя это новое свойство appendTo с jquery 1.10, div наложения был помещен в нужное место, поэтому модальное диалоговое окно работало правильно.
Показать ещё 1 комментарий
23

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

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

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

  • 1
    +1 Абсолютно верно. Исправил мою проблему для меня. Но зачем это нужно? Я не могу понять это.
21

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

  • 0
    Я переместил его внутрь формы: jQuery ("# dialog"). Parent (). AppendTo (jQuery ("form: first")); Но проблема все еще там ...
  • 0
    Вы не регистрируете какие-либо другие события jquery для объекта btnButton?
Показать ещё 9 комментариев
8

Мне не нужно было обойти эту проблему для каждого диалога в моем проекте, поэтому я создал простой плагин 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);</code></pre>

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

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

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

7

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

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

$("#dialog").dialog({
    appendTo: "form"
    ....
});
  • 0
    может быть слишком рано для модального диалога
7

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

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

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

$('#dialog').parent().appendTo($("form:first"))
3

Это было самым ясным решением для меня

var dlg2 = $('#dialog2').dialog({
        position: "center",
        autoOpen: false,
        width: 600,
        buttons: {
            "Ok": function() {
                $(this).dialog("close");
            },
            "Cancel": function() {
                $(this).dialog("close");
            }
        }
    });

dlg2.parent().appendTo('form:first');
$('#dialog_link2').click(function(){
    dlg2.dialog('open');

Все содержимое внутри dlg2 будет доступно для вставки в вашу базу данных. Не забудьте изменить переменную dialog в соответствии с вашими.

3

Я просто добавил следующую строку после создания диалога:

$(".ui-dialog").prependTo("form");
2

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

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

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

  • 0
    очень хороший :) хороший совет
1

Решение $('#dialog').parent().appendTo($("form:first")) отлично работает в IE 9. Но в IE 8 он заставляет диалоговое окно появляться и исчезать напрямую. Вы не можете увидеть это, если не поместите некоторые предупреждения, поэтому кажется, что диалог никогда не появляется. Однажды утром я нашел решение, которое работает в обеих версиях, и единственное решение, которое работает на обеих версиях 8 и 9, это:

$(".ui-dialog").prependTo("form");

Надеюсь, это поможет другим, кто борется с той же проблемой.

  • 3
    Я полагаю, что вы можете просто установить свойство UseSubmitBehavior Button в значение false . Таким образом, вам не нужно append или prepend вызовы.
1

Используйте эту строку, чтобы сделать эту работу при использовании опции modal: true.

open: function (type, data) { 
    $('.ui-widget-overlay').appendTo("form"); $(this).parent().appendTo("form"); 
  },
1

Решение от Robert MacLean с наибольшим количеством голосов на 99% правильное. Но единственное дополнение, которое может потребоваться, как и я, - это когда вам нужно открыть этот диалог jQuery, не забудьте добавить его к родительскому. Как ниже:

var dlg = $('#questionPopup').dialog( 'open'); dlg.parent().appendTo($("form:first"));

  • 0
    как указано в моем ответе выше 2 года назад, но все равно спасибо!
1

Переместите диалог правильно, но вы должны сделать это только в кнопке, открывающей диалог. Вот еще один код в образце jQuery UI:

$('#create-user').click(function() {
    $("#dialog").parent().appendTo($("form:first"))
    $('#dialog').dialog('open');
})

Добавьте свой asp:button в диалоговом окне, и он работает хорошо.

Примечание: вы должны изменить кнопку <button> на < input type = button > , чтобы предотвратить обратную передачу после нажатия кнопки "создать пользователя".

0

Точное решение:

$("#dialogDiv").dialog({ other options...,
    open: function (type, data) {
        $(this).parent().appendTo("form");
    }
});

Ещё вопросы

Сообщество Overcoder
Наверх
Меню