27

我创建了一个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>
4

10 回答 10

69

创建对话框后,只需将对话框移回您的表单。例子:

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

这对我有用。回发作品找到。

于 2009-03-03T21:14:31.400 回答
10

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

尝试:

$("#dialog").dialog({ autoOpen: false, height: 280, width: 440, modal: true, appendTo:"form" });
于 2013-05-11T11:11:31.077 回答
2

“AppendTo”选项对我有用。

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

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

于 2014-07-31T03:39:53.850 回答
1

我使用的一个厚颜无耻的技巧是在页面上的 div 中创建一个普通的.NET按钮以及文本框等,使用 jQuery 获取该div 的HTML,将其添加到对话框中,然后删除原始中的 HTML div 以避免 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
});
于 2009-02-23T14:30:10.063 回答
1

非常感谢 csharpdev 的帖子!以下代码为我的页面完成了它:

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

$("#photouploadbox").parent().appendTo($("form#profilform"));
于 2010-09-19T12:58:16.943 回答
0
'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。

让我们知道结果。

于 2009-02-20T09:00:04.063 回答
0

我设法解决了这个问题——可能不是最好的方法,但这就是我所做的。

该对话框不会回发,因为jQuery UI将提交按钮从表单中取出并将其附加到正文标记的底部,因此当您尝试回发按钮时,它不知道它正在发布什么。

我通过改变这个来修改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
               )

修改源库并不理想,但总比没有好。

于 2009-02-20T15:30:39.710 回答
0

当我使用它时,它按预期工作

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

代替

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

当我们追加到表单并重新打开对话框时,我遇到了布局和 z-index 的问题。

于 2013-08-15T03:12:52.893 回答
0

如果我每个都有一个,我可以让这个工作。一个div,一个脚本,一个链接。在我的例子中,对话框允许用户为每个数据库记录留下一个“注释”。我的对话框上没有任何按钮,只有默认的右上角“x”来关闭对话框。

但我试图让它在ColdFusion查询循环中工作。多条记录,每条记录都有自己的对话框按钮、关联的脚本和 div。我正在动态更改 ID,因此它们都是唯一的(也就是说,将 _XX 附加到所有 ID 中,其中 XX 是记录的主键)。

当我扩展到这个模型时,有多个对话框、脚本、div。如果我打开每个对话框来编辑该记录的相应“注释”,它只会保存最后一个。我应该在按钮单击时自动执行 .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 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>
于 2010-10-11T19:24:13.000 回答
0

要在将对话框附加到表单时消除动画故障,以下是策略。

open: function (event, ui) {
     var dg = $(this).parent();
     setTimeout(function () { dg.appendTo("form"); }, 1000);
});
于 2020-11-04T06:29:47.930 回答