2011-07-18 63 views
0

我打電話給我的UI對話框,從中有ScriptManager的,這樣頁:UI對話問題scriptManger和UpdatePanel的

function openDialog() { 

    var $dialog = jQuery('#dialog'); 
    $dialog.load('dialog.aspx'); 
    $dialog.dialog({ 
     autoOpen: false, 
     title: 'Add New Contact Personel', 
     modal: true, 
     height: 200, 
     width: 400, 
     show: 'puff', 
     hide: 'puff', 
     close: function (event, ui) { 
      $dialog.html(''); 
      $dialog.dialog('destroy'); 
     } 
    }); 
    $dialog.dialog('open'); 
} 

dialog.aspx的身體看起來是這樣的:

<body> 
    <form id="form1" runat="server"> 
<%-- <asp:ScriptManagerProxy ID="proxyScriptor" runat="server"></asp:ScriptManagerProxy> 
    <asp:UpdatePanel ID="upadatePanel" runat="server" UpdateMode="Conditional"> 
    <ContentTemplate>--%> 

    <div> 

     <table border="0"> 
      <tr> 
       <th>SomeText:</th> 
       <th><asp:TextBox ID="someTextBox" runat="server"></asp:TextBox></th> 
      </tr> 

     </table> 
    </div> 


    <asp:Panel ID="updatePanel" runat="server"> 
     <asp:Button ID="UpdateLoger" runat="server" Text="Update" onclick="Update_Click" /> 
    </asp:Panel> 

<%-- </ContentTemplate> 
    </asp:UpdatePanel>--%> 


    </form> 
</body> 

現在:如果我點擊updateBtn我要更新回傳文本,近距UI對話框,做刷新這樣的:

UpdateText(someTextBox.Text); 
      string script = @"jQuery('#dialog').html('');jQuery('#dialog').dialog('destroy');window.location.reload()"; 
      ScriptManager.RegisterClientScriptBlock(this, typeof(UpdatePanel), "jscript", script, true); 

因此,如果再添腳本管理器在這個頁面上的UI對話框,非常非常奇怪的事情發生(像__doPostBack不起作用),如果我刪除scriptManager,updatePanel不顯示它的內容,如果我把scriptMangerProxy,updatePanel不顯示它的內容。那麼我應該怎麼做呢?

回答

1

你在這裏有很多事情要做。你遇到的一個問題是你正在處理dialog.aspx,就像它加載到它自己的窗口或iframe中。實際上,它只是作爲文檔片段插入到頁面的DOM中。我懷疑,如果你檢查源,你會發現多個<body>標籤。

有幾種方法可以做到這一點。我的對話通常是唯一的特定頁面,所以我會有些處理對話框是這樣的:

Page.aspx

<html> 
<head>...</head> 
<body> 
    <!-- page content --> 

    <asp:Button ID="btnOpenDialog" runat="server" OnClick="btnOpenDialogClick" Text="Open Dialog" /> 

    <asp:UpdatePanel ID="upDialogs" runat="server" UpdateMode="Conditional"> 
    <ContentTemplate> 

    <asp:Panel ID="pnlDialog" runat="server" CssClass="pnlDialog" Visible="false"> 
     <!-- Dialog form --> 
     <asp:Button ID="btnSubmit" runat="server" OnClick="btnSubmitClick" Text="Submit" /> 
    </asp:Panel> 

    </ContentTemplate> 
    <Triggers> 
     <asp:AsyncPostbackTrigger ControlID="btnOpenDialog" /> 
    </Triggers> 
    </asp:UpdatePanel> 

    <script> 

    Sys.WebForms.PageRequestManager.getInstance().add_endRequest(function() { 


     $("div.pnlDialog").dialog({ 
      autoOpen: true, 
      title: 'Add New Contact Personel', 
      modal: true, 
      height: 200, 
      width: 400, 
      show: 'puff', 
      hide: 'puff', 
      close: function (event, ui) { 
      $dialog.html(''); 
      $dialog.dialog('destroy'); 
      } 
     }); 

    } 

    </script> 

</body> 
</html> 

Page.aspx.cs

... 
protected void btnOpenDialogClick(object sender, EventArgs e) 
{ 
    pnlDialog.Visible = true; 
    upDialogs.Update(); 
} 

protected void btnSubmitClick(object sender, EventArgs e) 
{ 
    ... save values ... 
    pnlDialog.Visible = false; 
    upDialogs.Update(); 
} 
... 

基本上,我們註冊一個JS函數以在頁面執行異步回發時觸發。這個函數查找對話框代碼。如果它發現它,它用jQueryUI連接它。如果它找不到任何東西,它只是靜靜地完成。如果您在頁面上有多個對話框,可以輕鬆重構該對話框以靈活處理它們。

+0

好的,但不是這樣,你有一個醜陋的postabck後btnOpenDialog點擊?我上面寫的所有代碼如果用window.location.reload()關閉UI對話框,這也是我想避免的一個難看的回發。 – kosnkov

+0

主要問題是,如果我不會做window.location.reload(),那麼我不知道,這個彈出式銷燬Viestate或者其他的東西,因爲__DoPostBack不起作用,所以我需要使用window.location來刷新它.reload(),有沒有其他辦法使__DoPostBack工作? – kosnkov

+0

對不起。我忘了將異步觸發器添加到更新面板。這應該防止「醜陋的回發」。 – chprpipr