2011-05-06 54 views
2

我有一些處理過程,首次將頁面加載到服務器上可能需要5秒以上的時間。這是一個超出我的控制範圍的外部約束,因爲它發生在可以添加到我的控制之外的服務器上的任何頁面的WebPart中,所以我不能在更大範圍內執行此處理,例如應用程序。如何在頁面加載到客戶端後執行部分回發?

我希望頁面顯示進度,而部分回發發生在更新面板中,而不是等待頁面加載的用戶在查看任何內容之前加載。該回發背後的代碼將完成繁忙的工作。

我試過使用ajax定時器,它的效果很好,除非在回發代碼後面引發異常。

總之,我想知道如何在客戶端加載頁面後立即執行一次部分回發。

回答

2

我想通了。爲了局部回傳通過一個UpdatePanel的服務器,而不使用隱藏的控制,用jQuery做到這一點:

<script type="text/javascript"> 
    $(document).ready(function() { 
     __doPostBack('<%=UpdatePanel1.ClientID %>'); 
    }); 
</script> 

這會盡快進行局部回傳,以防止與ID UpdatePanel1在UpdatePanel服務器作爲HTML DOM已準備就緒。然後,您可以使用ASP.NET頁面生命週期來掛接適合您的任何事件。我迷上到更新面板的加載事件:

protected void UpdatePanel1_Load(object sender, EventArgs e) 
{ 
    if (Page.IsPostBack && Session["InitializedKey"] == null) 
    { 
     Session["InitializedKey"] = true; 
     // do your initialization stuff here 
    } 
} 

上面的代碼將網頁是否回發只運行和會話變量。現在,當用戶刷新頁面時,必須清除會話變量,因爲此處的意圖是在第一個回發和僅第一個回發中運行此代碼。如此清晰的會話變量在Page_Load:

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!Page.IsPostBack) 
     Session[initializedKey] = null; 
} 

如果你想顯示進度指標的頁面是在局部回傳,這樣做的javascript:

<script type="text/javascript"> 
    var prm = Sys.WebForms.PageRequestManager.getInstance(); 
    prm.add_beginRequest(BeginRequestHandler); 
    prm.add_endRequest(EndRequestHandler); 
    function BeginRequestHandler(sender, args) { 
     if (args._postBackElement.id == '<%=UpdatePanel1.ClientID %>') { 
      $get('Progress').className = 'Progress'; 
     } 
    } 
    function EndRequestHandler(sender, args) { 
     if (sender._postBackSettings.sourceElement.id == '<%=UpdatePanel1.ClientID %>') { 
      $get('Progress').className = 'Hidden'; 
     } 
    } 
</script> 

這需要用div標籤ID「Progress」以及你想在該div內展示的內容。您還需要一些CSS來在名爲Hidden和Progress的類中的div標籤上設置顯示和可見樣式。不要忘記對部分回發進行錯誤處理!