JQuery对话框内的UpdatePanel未更新

时间:2013-09-16 13:54:21

标签: jquery asp.net jquery-ui updatepanel

我有一个控件,上面有几个更新面板。然后将控件加载到(非模态)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>  

1 个答案:

答案 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他们的回答而不是我的回答。