我创建了一个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>
答案 0 :(得分:69)
创建对话框后,只需将对话框移回表单即可。例如:
$("#divSaveAs").dialog({bgiframe:false,
autoOpen:false,
title:"Save As",
modal:true});
$("#divSaveAs").parent().appendTo($("form:first"));
这对我有用。回发作品找到了。
答案 1 :(得分:10)
请注意jQuery UI v1.10中还有其他设置。添加了一个appendTo设置,以解决您用于将元素重新添加到表单的ASP.NET变通方法。
尝试:
$("#dialog").dialog({ autoOpen: false, height: 280, width: 440, modal: true, appendTo:"form" });
答案 2 :(得分:2)
&#34; AppendTo&#34;选项对我有用。
$(&#34;#dialog&#34;)。dialog({...,appendTo:&#34; form&#34;});
答案 3 :(得分:1)
我用过的一个厚颜无耻的黑客是在页面上的div内创建一个普通的.NET按钮以及文本框等,使用jQuery获取该div的HTML,将其添加到对话框,然后删除原始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
});
答案 4 :(得分:1)
非常感谢csharpdev的帖子! 以下代码为我的页面执行了该操作:
$("#photouploadbox").dialog({
autoOpen: false,
modal: true,
buttons: { "Ok": function() { $(this).dialog("close"); } },
draggable: false,
minWidth: 400 });
$("#photouploadbox").parent().appendTo($("form#profilform"));
答案 5 :(得分: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。
让我们知道结果。
答案 6 :(得分: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
)
修改源库并不理想,但总比没有好。
答案 7 :(得分:0)
如果我有一个,我可以得到这个。一个div,一个脚本和一个链接。在我的例子中,对话框允许用户为每个数据库记录留下“注释”。我的对话框上没有任何按钮,只有默认的右上角“x”才能关闭对话框。
但是我试图让它在ColdFusion查询循环中工作..多个记录,每个记录都有自己的对话框按钮,关联脚本和div。我正在动态更改ID,因此它们都是唯一的(即,附加一个_XX,其中XX是所有ID的记录的主键)。
当我扩展到这个模型时,有多个对话框,脚本,div ..如果我打开每个对话框来编辑该记录的相应“注释”,它将只保存最后一个。我应该在按钮点击时自动执行.parent()。appendTo吗?在某个地方,它变得混乱。
如果我没有打开任何对话框(不通过对话框进行任何更改)并在表单结果上运行转储,我会看到所有对话框字段都按预期在帖子中显示。
当我查看生成的原始HTML时...所有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>
答案 8 :(得分:0)
当我使用
时,它按预期工作$("#divDlg").dialog("destroy");
而不是
$("#divDlg").dialog("close").appendTo($("#Form1")).hide();
当我们附加到Form并重新打开对话框时,我遇到了布局和z-index的问题。
答案 9 :(得分:0)
要在将对话框附加到窗体时消除动画故障,请采取以下策略。
open: function (event, ui) {
var dg = $(this).parent();
setTimeout(function () { dg.appendTo("form"); }, 1000);
});