我有一个控件,上面有几个更新面板。然后将控件加载到(非模态)JQueryUI对话框中。在大多数情况下,这很好 - 我可以让控件上的按钮触发并更新控件的一些部分,这些部分最终作为JQueryUI对话框的一部分显示给用户。
问题出现在事情变得混杂在一起的时候。在我的主页上有一个链接,可以重新打开主对话框并调用其先前的状态。最终这称为简单的javascript:
function openDialog(id, name)
{
// Tell asp.net code behind what we're trying load
var formField = document.getElementById('<%= userControl1.idField.ClientID %>');
formField.value = id;
// Tell asp.net to refresh the contents
__doPostBack('<%= userControl1.documentUpdatePanel.ClientID %>', '');
$("#dialog-editDoc").dialog
({
width: 400,
resizable: true,
open: function ()
{
// This is impotant for ASP.NET
$(this).parent().appendTo($("form:first"));
$(this).dialog("option", "title", "Editing Document - " + name);
}
});
}
这似乎工作正常,我在我的用户控件的代码后面得到PageLoad()
事件,我能够适当地更改内容。但是,当对话框显示时,刚刚更改的内容作为PageLoad()
的一部分。
奇怪的是,用户控件上的按钮被点击,事件正确触发,我可以在显示对话框时进行更改。似乎在将对话框显示为“更改状态”之前(或正在显示)存在一些困难。
那么,有没有人知道这方面的方法?我尝试过的其他事情:
__doPostBack(...)
移至open:
函数 - 同样的问题。编辑:
以下是在页面上加载用户控件的方式(它不在更新面板中,更新面板在文档编辑器控件中):
<div id="dialog-editDoc" class="dialogContent" title="{Context Sensitive}">
<mylib:DocEditor ID="userControl1" runat="server" />
</div>
答案 0 :(得分:0)
经过大量的调试后,我确定上面链接的代码可以在除之外的所有情况下工作,当触发JS事件的链接/按钮/ ...是UpdatePanel
时
那么我是如何解决这个问题的呢?好了,因为按钮已经在UpdatePanel
内,我可以附加到它的正常OnClick
事件,而不用担心整个页面刷新。在OnClick
事件中,我只是使用“标准”方式从代码隐藏RegisterStartupScript
调用JS函数,例如:
string JSFunction = "openDialog('id_goes_here','name_goes_here')";
ScriptManager.RegisterStartupScript(this.Page, typeof(Page), "runJS", jsFunction, true);
奇怪的是,这似乎有效。不确定为什么。最终,JS仍然完成所有工作,并且调用结构(通过调试器观察)是相同的。
如果有人能够解释为什么上述方法有效,而不仅仅是通过OnClientClick
直接调用JS函数,我会接受/ upvote他们的回答而不是我的回答。