web-dev-qa-db-ja.com

jQueryモーダルフォームダイアログポストバックの問題

jQuery UI モーダルフォームを作成しました。そのフォームでポストバックをトリガーしたいのですが、機能しません。

SimpleModalプラグインの使用に基づいた記事がかなりあることは知っています。これらを適合させて_doPostback関数をオーバーライドしようとしましたが、喜びはありませんでした。

私の問題は、__ doPostBack関数の呼び出しとパラメーターがどうあるべきかにあると思います。それは事実ですか?

これが私のフォームです

<form id="summaryForm" runat="server">
    <div id="dialog" title="Quick Booking">
        <p>Select user from list or enter name in box</p>
        <fieldset>
            <p><label>Is machine going out of the office?</label></p>
            <asp:RadioButton  TextAlign="Left" GroupName="outOfOffice" Text="Yes" ID="optYes" class="radio" runat="server" />
            <asp:RadioButton  TextAlign="Left" GroupName="outOfOffice" Text="No" ID="optNo" class="radio" runat="server" Checked="true" />

            <label for="dropLstUser">User:</label>
            <asp:DropDownList ID="dropLstUser" runat="server" />
            <input type="text" name="txtUser" id="txtUser" value="" class="text" />
            <label for="txtStartDate">Start Date:</label>
            <input type="text" id="txtStartDate" name="txtStartDate" class="datepicker" />
            <asp:HiddenField ID="assetField" runat="server" />
            <%--<button onclick="performPostBack('summaryForm')">Postback</button>--%>
        </fieldset>
    </div>
    //--------------------------------

JavaScriptコードは次のとおりです。

<script type="text/javascript">
    $(function() {
        $("#dialog").dialog({
            bgiframe: true,
            height: 300,
            modal: true,
            buttons: {
                'Close': function() {
                             alert("closing");
                             $(this).dialog("close");
                             __doPostBack = newDoPostBack;
                             __doPostBack("aspnetForm",null);
                         }
            }
        });
    });

    function newDoPostBack(eventTarget, eventArgument)
    {
        alert("postingback");
        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();
        }
    }
</script>
27
mancmanomyst

ダイアログを作成したら、ダイアログをフォームに戻します。例:

 $("#divSaveAs").dialog({bgiframe:false,
                            autoOpen:false,
                            title:"Save As",
                            modal:true});
    $("#divSaveAs").parent().appendTo($("form:first"));

これでうまくいきました。ポストバック作品が見つかります。

69
csharpdev

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

試してください:

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

「追加」オプションは私にはたらきます。

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

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

2
Msxmania

私が使用した生意気なハックの1つは、jQueryを使用して、ページのdiv内にテキストボックスなどとともに通常の 。NET ボタンを作成することです [〜#〜] html [〜#〜] そのdivをダイアログに追加し、元のdiv内のHTMLを削除してIDを回避します複製。

<div id="someDiv" style="display: none">
    <p>A standard set of .net controls</p>
    <asp:TextBox ID="textBoxl" runat="server" CssClass="required email"></asp:TextBox>
    <input id="button1" type="button" value="Confirm"  onclick="SomeEvent();" />
</div>

そしてスクリプト:

var html = $("#someDiv").html();
$("#dialog").append(html);
$("#someDiv").remove();
$("#dialog").dialog({
        bgiframe: true,
        height: 300,
        modal: true
});
1
Sheff

Csharpdevの投稿に感謝します!次のコードは私のページのためにそれをしました:

$("#photouploadbox").dialog({
    autoOpen: false,
    modal: true,
    buttons: { "Ok": function() { $(this).dialog("close"); } },
    draggable: false,
    minWidth: 400 });

$("#photouploadbox").parent().appendTo($("form#profilform"));
1
giginos

私はなんとか問題を解決することができました-おそらく最良の方法ではありませんが、これが私がやったことです。

jQuery UI が送信ボタンをフォームから取り出してbodyタグの下部に追加するため、ダイアログはポストバックしません。そのため、ボタンをポストバックしようとしても、ボタンの内容がわかりません。投稿。

これを変更してjQuery UIコードを変更することでこれを回避しました:

uiDialog = (this.uiDialog = $('<div/>'))
               .appendTo(document.body)
               .hide()
               .addClass(
                       'ui-dialog ' +
                       'ui-widget ' +
                       'ui-widget-content ' +
                       'ui-corner-all ' +
                       options.dialogClass
               )

これに:

uiDialog = (this.uiDialog = $('<div/>'))
               .appendTo(document.forms[0])
               .hide()
               .addClass(
                       'ui-dialog ' +
                       'ui-widget ' +
                       'ui-widget-content ' +
                       'ui-corner-all ' +
                       options.dialogClass
               )

ソースライブラリを変更することは理想的ではありませんが、何もしないよりはましです。

0
mancmanomyst

私が使用したときにそれは期待どおりに機能します

$("#divDlg").dialog("destroy");

の代わりに

$("#divDlg").dialog("close").appendTo($("#Form1")).hide();

フォームに追加してダイアログを再度開くと、レイアウトとz-indexに問題がありました。

0
Ullas

それぞれが1つあれば、これを機能させることができます。 1つのdiv、1つのスクリプト、および1つのリンク。私の場合、ダイアログにより、ユーザーはデータベースレコードごとに「メモ」を残すことができます。ダイアログにはボタンがありません。デフォルトの右上の「x」だけでダイアログを閉じます。

しかし、これを ColdFusion クエリループ内で機能させるようにしています。複数のレコードがあり、それぞれに独自のダイアログボタン、関連するスクリプト、およびdivがあります。すべてが一意になるようにIDを動的に変更しています(つまり、_XXを追加します(XXはすべてのIDのレコードの主キーです)。

複数のダイアログ、スクリプト、divを持つこのモデルに展開すると、各ダイアログを開いてそのレコードの対応する「ノート」を編集すると、最後の1つだけが保存されます。ボタンクリックで.parent()。appendToを実行するか、自動で実行する必要がありますか?どこか混乱しています。

ダイアログを開かず(ダイアログで変更を加えないでください)、フォームの結果に対してダンプを実行すると、期待どおりにすべてのダイアログフィールドが投稿に表示されます。

生成された生のHTMLを見ると...すべてのIDは一意であり、適切に呼び出されます。競合する名前/ IDのどこかで衝突が発生していると思っていましたが、その面ではすべて問題ありません。

私のスクリプト:

<script type="text/javascript">
    // Increase the default animation speed to exaggerate the effect
    $.fx.speeds._default = 1000;
    $(function() {
        $( "##dialog#getALLFacilityEquipOrders.order_id#" ).dialog({
            autoOpen: false,
            show: "blind",
            hide: "explode",
            width: 500,
            resizable: false
        });

        $('.countable2').jqEasyCounter({
            'maxChars': 2000,
        });

        // Dialog Link
        $('##dialog_link#getALLFacilityEquipOrders.order_id#').click(function(){
            $('##dialog#getALLFacilityEquipOrders.order_id#').dialog('open');
            return false;
        });

        //hover states on the static widgets
        $('##dialog_link#getALLFacilityEquipOrders.order_id#, ul##icons li').hover(
            function() { $(this).addClass('ui-state-hover'); },
            function() { $(this).removeClass('ui-state-hover'); }
        );

        $("##dialog#getALLFacilityEquipOrders.order_id#").parent().appendTo($("form##allequipedit"));
    });
</script>

私のdiv:

<div id="dialog#getALLFacilityEquipOrders.order_id#"
     title="Notes For #getALLFacilityEquipOrders.cLicenseNumber# - Order ID: ORD-#getALLFacilityEquipOrders.order_id#"
     style="display:none;">

    <cfquery datasource="#a_dsn#" name="getOrderNotes">
        select notebody
        from QIP_EquipOrders_Notes
        where fk_order_id = #getALLFacilityEquipOrders.order_id#
    </cfquery>
    <fieldset class="qip_menu">
        <label><b>Enter/Edit Notes:</b></label>
        <textarea class="countable2"
                  id="notebody_#getALLFacilityEquipOrders.order_id#"
                  name="notebody_#getALLFacilityEquipOrders.order_id#"
                  rows="10"
                  cols="75">#getOrderNotes.notebody#</textarea>
    </fieldset>
</div>

私のボタン:

<a href="##"
   id="dialog_link#getALLFacilityEquipOrders.order_id#"
   class="ui-state-default ui-corner-all"
><span class="ui-icon ui-icon-newwin"></span>Notes</a>
0
Steve
'Close': function() {
             alert("closing"); 
             $(this).dialog("close"); 
             __doPostBack = newDoPostBack; 
             __doPostBack("aspnetForm", null); 
         }}});}); 

__doPostBack関数は、ポストバックを引き起こす制御と、必要に応じて引数を取ります。 JavaScriptの例とマークアップが一致していないようです。たとえば、上記で引用した場所では、aspnetFormを参照し、これをフォームのIDに変更して、再試行します。

クライアントスクリプトに使用するIDが、実行時の ASP.NET コントロールのクライアントIDと同じであることを確認してください。コントロールがINamingContainerに存在する場合、その親コン​​テナーに基づく一意のIDを持つため、YourControlIDはYourINaminContainerID_YourControlIDになります。

結果をお知らせください。

0
REA_ANDREW