ASP.NETボタンポストバック付きのjQuery UIダイアログ


295

私のASP.NETページでjQuery UIダイアログがうまく機能しています:

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

しかし、まだ成功していません...


LOL ...最初はあなたが私の質問を盗んだと思ったが、それからあなたが最初に尋ねられたのを見た。私はFancyBoxに同じ質問をしてきました- stackoverflow.com/questions/2686362/...を
nikib3ro

1
appendTo()を明示的に呼び出すよりも良い答えがあります。このstackoverflow.com/a/20589833/2487549を
Foreever

回答:


314

ソリューションに近づき、間違ったオブジェクトを取得するだけです。次のようになります。

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"));
});

モーダルオプションがtrueに設定されている場合はどうなりますか?私の場合、解決策は完璧ですが、モーダルなし-モーダルでは、モーダル効果用に作成されたdivは、parent()メソッドを使用してダイアログの上に配置されます
SammuelMiranda

37
$('#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>

この完全な例は、この問題が発生したときに欠けていたものをまとめるのに役立ちました。ありがとう!
Dillie-O

34

FWIW、form:firstテクニックは私にはうまくいきませんでした。

しかし、そのブログ記事のテクニックは次のとおりです。

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

具体的には、これをダイアログ宣言に追加します。

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

1
更新パネルでこれを行わない場合、このメソッドは、ボタン(フルポストバックを実行したい)を機能させる唯一の方法です。
メリット

これのための+1は、これが私のために働いた唯一のコードです。更新パネルを使用していません。ありがとうございました!!!私の日を救った!
Albert Laure 2013年

+1:上記の解決策が機能しなかった場合、これは私にとってはうまくいきました。そして、私はUpdatePanelを使用しています。
ビビアン川

ダイアログボックスをフォームに戻してPostBack動作にするための最も簡単で最良の解決策。
GoldBishop 2017年

28

jQuery UI v1.10には追加の設定があることに注意してください。要素をフォームに再追加するために使用しているASP.NETの回避策に対処するために、appendTo設定が追加されています。

試してください:

$("#dialog").dialog({
     autoOpen: false,
     height: 280,
     width: 440,
     modal: true,
     **appendTo**:"form"
});

同じページに2つのjqueryダイアログがあるので、これは機能しません。それが正しい解決策であることを願っています。
マシューロック

3
parent()。appendTo( "form")技法は、モーダルダイアログでは機能しませんでした。オーバーレイdivがフォームの外側にとどまり、最終的にダイアログを覆ってしまう(レンダリングできない)ためです。この新しいappendToプロパティをjquery 1.10で使用することにより、オーバーレイdivが適切な場所に配置され、モーダルダイアログが正しく機能しました。
humbads

jQuery UIライブラリが追加され、appendTo設定が追加されたため、これが正しい答えになるはずです。ありがとう@マイクは私に多くの時間を節約してくれました。
AJP 2015年

24

上記のケンの答えは私のためのトリックをしました。受け入れられた回答の問題は、ページに単一のモーダルがある場合にのみ機能することです。複数のモーダルがある場合は、ダイアログの初期化時に、事後ではなく、 "open"パラメータでインラインで実行する必要があります。

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

最初に受け入れられた回答が複数のモーダルで伝えていることを行うと、ページの最後のモーダルのみが正しく動作し、すべてのモーダルがポストバックされません。


1
+1絶対に正しい。私の問題を修正しました。しかし、なぜそれが必要なのでしょうか?それを理解することはできません。
Colin、

21

これは主に、jQueryがDOMを使用してフォームタグの外にダイアログを移動するためです。フォームタグ内に戻します。これで問題なく動作するはずです。これは、Firefoxで要素を調べるとわかります。


フォーム内に移動しました:jQuery( "#dialog")。parent()。appendTo(jQuery( "form:first")); しかし、問題はまだそこにあります
ポール

あなたはbtnButtonオブジェクトで他のjqueryイベントを登録していませんか?
チャドルパート、

そしてそれをいつフォームに戻すのですか?開封直後?
チャドルパート

jQuery(function(){jQuery( "#dialog")。dialog({draggable:true、resizable:true、show: 'Transfer'、hide: 'Transfer'、width:320、autoOpen:false、minHeight:10、minwidth :10}); jQuery( "#dialog")。parent()。appendTo(jQuery( "form:first"));}); 本来あるべき姿です。
チャドルパート

まだ喜びはありませんか?少なくともボタンをクリックすると、フォームの場合は投稿が表示されます。JSエラーが発生していますか?モーダルは閉じていませんか?
チャドルパート

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 UIをロードしてから、プラグインをロードします。その後、次のようなことができます:

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

明確にするために、このプラグインは、呼び出し時にダイアログを表示する準備ができていることを前提としています。


8

私はこれが古い質問であることを知っていますが、同じ問題を抱えている人のために、より新しくて簡単な解決策があります。jQueryUI 1.10.0で「appendTo」オプションが導入されました

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

$("#dialog").dialog({
    appendTo: "form"
    ....
});

モーダルダイアログには早すぎるかもしれません
Wolfgang Fahl 2014

魅力的な作業
mzonerz

7

素晴らしい!これにより、jQueryモーダル内でASP:Buttonイベントが発生しないという私の問題が解決しました。次の条件でjQuery UIモーダルを使用すると、ボタンイベントが発生することに注意してください。

// 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変数を自分に合わせて変更することを忘れないでください。



1

投票数が最も多いロバートマクリーンのソリューションは99%正解です。しかし、誰かが必要とする可能性がある唯一の追加は、私がしたように、このjQueryダイアログを開く必要があるときはいつでも、それを親に追加することを忘れないでください。以下のように:

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


2年以上前の私の回答で述べたように、とにかくありがとう!
マイク

1

この行を使用して、modal:trueオプションを使用しながらこれを機能させます。

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

1

$('#dialog').parent().appendTo($("form:first"))解決策は、IE 9の罰金を動作しますが、IE 8にはダイアログが表示され、直接消えます。これは、ダイアログを表示しないようにアラートを配置しない限り表示されません。ある朝、両方のバージョンで機能するソリューションを見つけるのに費やしました。バージョン8と9の両方で機能する唯一のソリューションは次のとおりです。

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

これが同じ問題に苦しんでいる他の人を助けることを願っています


3
UseSubmitBehaviorボタンのプロパティをfalse値に設定するだけでいいと思います。このように、あなたは何もappendまたはprepend呼び出しを必要としません。
Yuriy Rozhovetskiy 2013

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");
    }
});
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.