2011-03-25 121 views
1

我有一個ASP.NET頁面上有一個控件(.ascx)。頁面(.aspx)onload將一些文本分配給幾個標籤並將產品ID傳遞給.ascx控件。 .ascx控件onload從.aspx頁面獲取產品ID並多次訪問數據庫,執行幾次計算等 - 基本上需要很長時間才能加載。.ASCX控件完成加載之前,允許.ASPX頁面顯示?

所以,當我點擊這個.aspx頁面的鏈接時,頁面加載需要7-10秒。我已經縮小了對.ascx控件計算的罪魁禍首,我儘可能地優化了代碼......但它仍然需要很長時間。

有沒有一種方法可以在控制加載之前加載.aspx頁面? (也許顯示一個「正在加載...」動畫?就像UpdateProgress中使用的那樣?)

+0

您可能會考慮發佈需要7秒左右才能執行的代碼。這是運行一些計算和查詢所需的大量時間。聽起來好像數據庫需要更好的索引 – NotMe 2011-03-25 19:28:59

回答

1

實現此目的的唯一可能方法是將其設置爲單獨的HTTP資源。目前,.NET正在將控件集成到頁面中,以便它等待直到它有所需的所有響應。

你能做到這一點的多種不同方式:即得到通過包含控件(和iFrame中託管的JavaScript

  • 單獨的頁面叫似乎是在同一

    • Web服務頁)

    要做到這一點,最好的方法是使用iFrame(或類似的東西),它會指示瀏覽器在發送主頁面後請求控件)。

  • 1

    就我個人而言,我絕不會使用iFrame在頁面上加載內容 - 這更像是一件比任何事情都更糟糕的事情,加上iframe ==「糟糕」。

    但他們是對的,你將無法做任何你想要的東西。

    如果用戶控件沒有任何引起回發的網頁控件(或者有任何需要在回發期間訪問的表單控件),那麼我會在頁面有問題後使用AJAX請求服務器上的數據已經加載並使用JavaScript來顯示頁面上的內容。

    2

    你可以用UpdatePanel做到這一點。這將需要一點小小的詭計,但嘗試這樣:

    1)將UserControl放入UpdatePanel

    2)在您的用戶控件上放置一個公共屬性,如IsEnabled,它將用於有條件地不做任何事情或呈現「請稍候」。從主頁面設置爲false。

    3)OnInit添加一些代碼,您的主頁:

    if (MyScriptManager.IsInAsyncPostback) { 
        MyUserControl.IsEnabled=true; 
    } 
    

    4)添加客戶端腳本沿着這些線路:

    finished=false; 
    Sys.WebForms.PageRequestManager.pageLoaded(function(sender,args) { 
        if (!finished) { 
         finished=true; 
         __doPostBack('',''); 
         // you can include the uniqueID of your updatepanel as the first arg 
        // otherwise it will refresh all update panels 
        } 
    }); 
    

    或使用jQuery ..

    finished=false; 
    $(document).ready(function() { 
        if (!finished) {... 
        } 
    }); 
    

    這是什麼應該做的是使頁面加載完成後,這將反過來導致更新面板被刷新立即啓動一個異步回發。由於您在異步回發中將其設置爲啓用,它將在第二次呈現自己。

    相關問題