2013-02-21 30 views
1

部分回發期間我有一個ASP.NET頁面(WebForm1的)。關閉對話框後,我只需通過JavaScript更新UpdatePanel。現在的問題是,在這個js調用它不會阻止用戶界面時,,對於一些進一步的處理將打開一個模態對話框WebForm2(經由OpenForm2()js函數)BlockUI通過JavaScript

這只是發生時,我打電話從服務器端(的button1_Click)的OpenForm2 JS方法。由於UI已進入阻止模式,因此在關閉WebForm2後,它不會等待完成部分回發(JavaScript)並取消阻止UI。

如果我直接調用JS OpenForm2在按鈕(按鈕2樣品中)的標籤的OnClientClick功能,它運作良好,並保持阻塞UI,直到回傳完成。

我試圖在add_endRequest中封裝部分回發js代碼,但在這種情況下,它一直調用refreshUpdatePanel()js方法,因此阻止/解除阻止UI繼續進行。可能這是由於在這種情況下在頁面上使用了兩個add_endRequest?

在這方面高度讚賞任何援助。

注:我已經使用jQuery的blockUI期間部分回發堵的頁面。

爲WebForm1的頁面中的代碼示例如下。 (WebForm2 aspx頁面只有一個關閉對話框和相關js函數的按鈕)。

WebForm1.aspx的

<head runat="server"> 
    <title></title> 
    <script src="js/jquery-1.6.1.min.js" type="text/javascript"></script> 
    <script src="js/jquery.blockUI.js" type="text/javascript"></script> 
    <script type="text/javascript"> 
     function OpenForm2() { 
      var url = "WebForm2.aspx"; 
      var width = 950; 
      var height = 455; // screen.availHeight - (120 + 65); 

      // open modal dialog 
      obj = window.showModalDialog(url, window, "dialogWidth:" + width + "px; dialogHeight:" + height + "px; center:yes"); 

      // partial postback to reflect the changes made by form2 
      refreshUpdatePanel(); 
      //Sys.WebForms.PageRequestManager.getInstance().add_endRequest(refreshUpdatePanel); 
      // ** here it doesn't wait for the completion and unblocks the UI ** 
     } 

     function refreshUpdatePanel() { 
      //window.__doPostBack('UpdatePanel1', '1'); 
      // a timeout/delay before a client side updatepanel postback. That compelled the UI to go in blocking again with a little screen flickering. 
      setTimeout('__doPostBack("<%= UpdatePanel1.ClientID %>", "1")', 0); 
     } 

     $(document).ready(function() { 
      var prm = Sys.WebForms.PageRequestManager.getInstance(); 
      prm.add_initializeRequest(InitializeRequest); 
      prm.add_endRequest(EndRequest); 

      $.blockUI.defaults.css = {}; 
      function InitializeRequest(sender, args) { 
       // Whatever you want to happen when the async callback starts 
       $.blockUI(); 
      } 
      function EndRequest(sender, args) { 
       // Whatever you want to happen when async callback ends 
       $.unblockUI(); 
      } 
     }); 
    </script> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <asp:ScriptManager ID="ScriptManager1" runat="server"> 
    </asp:ScriptManager> 
    <asp:Label ID="Label1" runat="server" Text=""></asp:Label> 
    <asp:UpdatePanel ID="UpdatePanel1" runat="server" OnLoad="UpdatePanel1_Load"> 
     <ContentTemplate> 
      <asp:Label ID="Label2" runat="server" Text=""></asp:Label><br /> 
      <asp:Button ID="Button1" runat="server" Text="Button 1" OnClick="Button1_Click" /> 
      <asp:Button ID="Button2" runat="server" Text="Button 2" OnClientClick="OpenForm2();return false;" /> 
     </ContentTemplate> 
    </asp:UpdatePanel> 
    </form> 
</body> 

WebForm1.aspx.cs中

protected void Button1_Click(object sender, EventArgs e) 
{ 
    // some server side processing here 
    System.Threading.Thread.Sleep(1000); 

    // then calling javascript function to open form2 as modal 
    ScriptManager.RegisterClientScriptBlock(UpdatePanel1, UpdatePanel1.GetType(), "Button1Click", "OpenForm2();", true); 
} 

protected void UpdatePanel1_Load(object sender, EventArgs e) 
{ 
    string parameter = Request["__EVENTARGUMENT"]; 
    if (parameter == "1") 
    { 
     System.Threading.Thread.Sleep(3000); 
     Label2.Text = DateTime.Now.ToString(); 
    } 
} 
+0

我沒有找到解決此問題的方法。但是對於解決方法,我在客戶端updatepanel回發之前放置了一個超時/延遲。這迫使UI在屏幕閃爍的情況下再次進入阻塞狀態。我已經更新了示例中上面的refreshUpdatePanel()js方法中的代碼行。 – 2013-02-24 13:47:44

回答

0

使用

function refreshUpdatePanel() { 
     __doPostBack"<%= UpdatePanel1.ClientID %>", '1'); 
    } 

,而不是

function refreshUpdatePanel() { 
     window.__doPostBack('UpdatePanel1', '1'); 
    } 

謝謝

+0

不,這不是問題。我剛剛檢查了您的修改建議。但是,我還檢查了頁面源代碼,UpdatePanel的ID保持不變。 – 2013-02-21 09:39:07

相關問題