jQuery UI对话框与ASP.NET按钮回发

298

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

但是仍然没有成功...


哈哈...起初我以为你抄袭了我的问题,但后来我看到你先问了。我也曾经问过同样的问题关于FancyBox - https://dev59.com/wnE85IYBdhLWcg3wnU-p - nikib3ro
1
有比显式调用appendTo()更好的答案。请查看https://dev59.com/CXI-5IYBdhLWcg3w6tJR#20589833 - Foreever
17个回答

315

您已经接近解决方案,只是获取了错误的对象。应该像这样:

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

1
如果您不在 UpdatePanel 中执行此操作,那么这种方法是我能够使我的按钮(我希望进行完全回发)正常工作的唯一途径。 - Merritt
+1,因为这是唯一对我有效的代码。我没有使用更新面板。谢谢!拯救了我的一天! - Albert Laure
+1:当上面的解决方案不起作用时,这个对我有用。而且我正在使用UpdatePanel。 - Vivian River
将对话框回到表单以进行PostBack行为的最简单和最佳解决方案。 - GoldBishop

28

请注意,jQuery UI v1.10 中有一个额外的设置。已添加了一个 appendTo 设置,以解决您正在使用的 ASP.NET 解决方法,以将元素重新添加到表单中。

尝试:

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

这对我在同一页上有2个jQuery对话框时不起作用。我希望它能够正常工作,因为这是正确的解决方案。 - Matthew Lock
3
parent().appendTo("form") 方法在模态对话框中无效,因为遮罩层 div 位于表单之外并覆盖了对话框(导致其无法操作)。使用 jQuery 1.10 中的新 appendTo 属性将遮罩层 div 放置在正确的位置,从而使模态对话框正常工作。 - humbads
现在这应该是正确的答案,因为jQuery UI库已经更新以添加appendTo设置。谢谢@Mike,节省了我很多时间。 - AJP

25
ken的回答对我很有帮助。被采纳的答案只适用于页面上有单个模态窗口的情况。如果你有多个模态窗口,你需要在初始化对话框时内联执行"open"参数,而不是事后执行。
open: function(type,data) { $(this).parent().appendTo("form"); }

如果你按照第一个被接受的答案所说的做法使用多个模态框,你只能使页面上最后一个模态框正常运行并正确触发回传,而不是所有模态框。


1
+1 确实如此。为我解决了问题。但为什么这是必要的?我搞不明白。 - Colin

21
主要是因为jQuery使用DOM将对话框移到表单标签之外。将其移回表单标签内,它就会正常工作。您可以在Firefox中检查元素以查看此操作。

你没有在btnButton对象上注册任何其他的jQuery事件,对吧? - Chad Ruppert
你什么时候把它放回表单中?是在打开后立即吗? - Chad Ruppert
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")); });这就是它应该的样子。 - Chad Ruppert
还是没有成功吗?至少当你点击按钮时,如果在表单中,它应该引起一次提交。你有JS错误吗?模态框没有关闭或者其他什么情况吗? - Chad Ruppert
@Chad Ruppert:如果你获得或失去任何声望,我会感到失望。(他目前处于1337) /极客 - Kyle Trauberman
显示剩余4条评论

8

我知道这是一个老问题,但对于任何遇到同样问题的人来说,现在有一个更简单的解决方案:jQuery UI 1.10.0引入了“appendTo”选项。

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

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

可能现在弹出模态对话框还为时过早。 - Wolfgang Fahl
工作得很顺畅。 - mzonerz

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!

需要明确的是,此插件假定您在调用时已准备好显示对话框。


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变量以匹配您自己的变量。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接