Dialog UI jQuery dengan postback tombol ASP.NET

295

Saya memiliki Dialog jQuery UI yang bekerja dengan baik di halaman ASP.NET saya:

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 saya:

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

Tetapi btnButton_Click tidak pernah dipanggil ... Bagaimana saya bisa menyelesaikannya?

Informasi lebih lanjut: Saya menambahkan kode ini untuk memindahkan div ke formulir:

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

Tetapi masih belum berhasil ...

Paul
sumber
LOL ... awalnya saya pikir Anda mencuri pertanyaan saya, tetapi kemudian saya melihat Anda bertanya terlebih dahulu. Saya telah mengajukan pertanyaan yang sama untuk FancyBox - stackoverflow.com/questions/2686362/…
nikib3ro
1
Ada jawaban yang lebih baik daripada memanggil appendTo () secara eksplisit. Periksa stackoverflow.com/a/20589833/2487549
Foreever

Jawaban:

314

Anda dekat dengan solusinya, hanya mendapatkan objek yang salah. Seharusnya seperti ini:

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"));
});
Robert MacLean
sumber
bagaimana jika ia memiliki opsi modal yang disetel ke true? dalam kasus saya solusinya sempurna, tetapi tanpa modal - dengan modal, div yang dibuat untuk efek modal ditempatkan di atas dialog dengan metode parent ()
SammuelMiranda
37
$('#divname').parent().appendTo($("form:first"));

Menggunakan kode ini memecahkan masalah saya dan berhasil di setiap browser, Internet Explorer 7, Firefox 3, dan Google Chrome. Saya mulai menyukai jQuery ... Ini kerangka yang keren.

Saya telah menguji dengan render parsial juga, persis apa yang saya cari. Bagus!

<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>
Marco
sumber
Contoh lengkap ini membantu saya mengumpulkan apa yang saya lewatkan saat menghadapi masalah ini. Terima kasih!
Dillie-O
34

FWIW, bentuk: teknik pertama tidak berhasil untuk saya.

Namun, teknik dalam artikel blog itu:

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

Secara khusus, menambahkan ini ke deklarasi dialog:

  open: function(type,data) {
    $(this).parent().appendTo("form");
  }
ken
sumber
1
jika Anda tidak melakukannya di panel pembaruan, metode ini adalah satu-satunya cara saya bisa mendapatkan tombol saya (yang ingin saya lakukan postback penuh) untuk bekerja.
Merritt
+1 untuk ini, ini adalah satu-satunya kode yang berfungsi untuk saya. Saya tidak menggunakan panel pembaruan. TERIMA KASIH!!! menyelamatkan hari saya!
Albert Laure
+1: Ini berfungsi untuk saya ketika solusi di atas tidak berhasil. Dan saya menggunakan UpdatePanel.
Sungai Vivian
Solusi paling sederhana dan terbaik untuk mengembalikan kotak Dialog ke perilaku Form for PostBack.
GoldBishop
28

Perlu diketahui bahwa ada pengaturan tambahan di jQuery UI v1.10. Ada pengaturan appendTo yang telah ditambahkan, untuk mengatasi solusi ASP.NET yang Anda gunakan untuk menambahkan kembali elemen ke formulir.

Mencoba:

$("#dialog").dialog({
     autoOpen: false,
     height: 280,
     width: 440,
     modal: true,
     **appendTo**:"form"
});
Mike
sumber
Ini tidak berfungsi untuk saya dengan 2 dialog jquery di halaman yang sama. Saya berharap ini akan menjadi solusi yang tepat.
Matthew Lock
3
Teknik parent (). AppendTo ("form") tidak berfungsi dengan dialog modal karena div overlay tetap berada di luar form dan berakhir dengan menutup dialog (menjadikannya tidak dapat dioperasikan). Dengan menggunakan properti appendTo baru ini dengan jquery 1.10, overlay div diletakkan di tempat yang tepat, sehingga dialog modal bekerja dengan benar.
humbads
Ini seharusnya jawaban yang benar sekarang karena perpustakaan UI jquery telah diperbarui untuk menambahkan pengaturan appendTo. Terima kasih @Mike menyelamatkan saya banyak waktu.
AJP
24

Jawaban ken di atas membantu saya. Masalah dengan jawaban yang diterima adalah bahwa itu hanya berfungsi jika Anda memiliki modal tunggal pada halaman. Jika Anda memiliki banyak modals, Anda harus melakukannya sebaris di param "terbuka" sambil menginisialisasi dialog, bukan setelah faktanya.

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

Jika Anda melakukan apa yang jawaban pertama yang diterima memberi tahu Anda dengan banyak modals, Anda hanya akan mendapatkan modal terakhir pada halaman yang menjalankan postback dengan benar, tidak semuanya.

nickb
sumber
1
+1 Benar sekali. Memperbaiki masalah saya untuk saya. Tetapi mengapa itu perlu? Saya tidak tahu itu.
Colin
21

Terutama itu karena jQuery memindahkan dialog di luar tag formulir menggunakan DOM . Pindahkan kembali ke dalam tag formulir dan itu akan berfungsi dengan baik. Anda dapat melihat ini dengan memeriksa elemen di Firefox.

Chad Ruppert
sumber
Saya memindahkannya di dalam form: jQuery ("# ​​dialog"). Parent (). AppendTo (jQuery ("form: first")); Tetapi masalahnya masih ada ...
Paul
Anda tidak mendaftarkan acara jquery lainnya di objek btnButton, bukan?
Chad Ruppert
dan kapan Anda memasukkannya kembali ke formulir? segera setelah buka?
Chad Ruppert
dialog jQuery (function () {jQuery ("# ​​dialog"). ({draggable: true, resizable: true, tampilkan: 'Transfer', sembunyikan: 'Transfer', lebar: 320, autoOpen: false, minTinggi: 10, minwidth : 10}); jQuery ("# ​​dialog"). Parent (). AppTo (jQuery ("form: first"));}); adalah apa yang seharusnya.
Chad Ruppert
dan masih tidak ada sukacita? paling tidak ketika Anda mengklik tombol, jika dalam bentuk, itu harus menyebabkan posting. Apakah Anda mendapatkan kesalahan JS sama sekali? Modal tidak menutup atau apa?
Chad Ruppert
8

Saya tidak ingin harus mengatasi masalah ini untuk setiap dialog di proyek saya, jadi saya membuat plugin jQuery sederhana. Plugin ini hanya untuk membuka dialog baru dan menempatkannya dalam formulir 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>

Jadi untuk menggunakan plugin, Anda pertama-tama memuat jQuery UI dan kemudian plugin. Maka Anda dapat melakukan sesuatu seperti berikut:

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

Agar jelas, plugin ini mengasumsikan Anda siap untuk menampilkan dialog saat Anda menyebutnya.

James Sumners
sumber
8

Saya tahu ini adalah pertanyaan lama, tetapi bagi siapa pun yang memiliki masalah yang sama ada solusi yang lebih baru dan lebih sederhana: opsi "appendTo" telah diperkenalkan di jQuery UI 1.10.0

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

$("#dialog").dialog({
    appendTo: "form"
    ....
});
Jecho Jekov
sumber
mungkin terlalu dini untuk dialog modal
Wolfgang Fahl
Bekerja dengan apik
mzonerz
7

Fantastis! Ini memecahkan masalah saya dengan ASP: Acara tombol tidak menyala di dalam modal jQuery. Harap dicatat, menggunakan modal UI jQuery dengan yang berikut ini memungkinkan acara tombol diaktifkan:

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

Baris berikut adalah kunci untuk membuatnya bekerja!

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

Saya baru saja menambahkan baris berikut setelah Anda membuat dialog:

$(".ui-dialog").prependTo("form");
Buden Niere
sumber
3

Ini solusi paling jelas untuk saya

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');

Semua konten di dalam dlg2akan tersedia untuk dimasukkan ke dalam basis data Anda. Jangan lupa untuk mengubah dialogvariabel agar sesuai dengan variabel Anda.

Matteus
sumber
3

Dengan ASP.NET gunakan saja UseSubmitBehavior="false"tombol ASP.NET Anda:

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

Referensi: Button.UseSubmitBehavior Property

Guilherme de Jesus Santos
sumber
1

Solusi dari Robert MacLean dengan jumlah suara tertinggi adalah 99% benar. Tetapi satu-satunya tambahan yang mungkin diperlukan seseorang, seperti yang saya lakukan, adalah kapan pun Anda perlu membuka dialog jQuery ini, jangan lupa menambahkannya ke orang tua. Seperti di bawah ini:

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

Yahya
sumber
seperti yang dinyatakan dalam jawaban saya di atas lebih dari 2 tahun yang lalu, tapi terima kasih!
Mike
1

Gunakan baris ini untuk membuat ini berfungsi saat menggunakan modal: opsi benar.

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

The $('#dialog').parent().appendTo($("form:first"))solusi bekerja dengan baik di IE 9. Tapi di IE 8 itu membuat dialog muncul dan menghilang secara langsung. Anda tidak dapat melihat ini kecuali jika Anda menempatkan beberapa peringatan sehingga tampaknya dialog tidak pernah muncul. Saya menghabiskan satu pagi menemukan solusi yang berfungsi pada kedua versi dan satu-satunya solusi yang bekerja pada kedua versi 8 dan 9 adalah:

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

Semoga ini bisa membantu orang lain yang bergulat dengan masalah yang sama

Moorlang
sumber
3
Saya percaya Anda bisa mengatur UseSubmitBehaviorproperti Button ke falsenilai. Dengan cara ini Anda tidak perlu appendatau prependpanggilan.
Yuriy Rozhovetskiy
1

Gerakkan dialog dengan cara yang benar, tetapi Anda harus melakukannya hanya di tombol membuka dialog. Berikut adalah beberapa kode tambahan dalam sampel jQuery UI:

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

Tambahkan asp:buttonbagian dalam dialog Anda, dan itu berjalan dengan baik.

Catatan: Anda harus mengubah <button> menjadi <input type = button> untuk mencegah postback setelah Anda mengklik tombol "buat pengguna".

Peter Mortensen
sumber
0

Solusi yang tepat adalah;

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