2010-04-22 30 views
2

問題是呈現巨大的報告。基本上我們有大量的數據在html報告中呈現(大部分使用中繼器或gridview)。正如它發生的那樣,數據開始很小,現在我們有很多。有很多這樣的報告已經建成,所以全面重寫不是一種選擇。哎呀,這家公司甚至沒有讓我們分頁數據。 現在每次我們嘗試渲染一些報告時,服務器內存都會彈出。所以問題是 - 有沒有什麼辦法可以將數據綁定到中繼器,並在大塊準備好時將它流式傳輸到瀏覽器?那樣我們希望不要一次將所有數據帶入應用服務器。我想我們會使用數據讀取器或其他東西來獲取部分數據並將其呈現給瀏覽器。任何指針,鏈接,想法?呈現asp.net轉發器as-and-when html準備就緒(流式傳輸)

回答

0

你有幾個選擇,但你不能使用中繼器來做到這一點。

ASP.NET將不會輸出在ASPX中定義的HTML,直到它遇到the rendering stage of the page lifecycle。在此之前,頁面(在Page_Init,Page_Load等)中幾乎可能會發生任何事情:它可能會向頁面添加或刪除控件,它可能會綁定數據源等。因此,無法知道要發送到客戶端。

一個選項是使用AJAX從客戶端構建報表:首先加載HTML,然後使用對服務器的增量調用修改它,直到消耗完所有報表數據。這可以讓你把報告分成任何你想要的大小,但它可能會變得相當複雜。 (在另一方面,也許有人已經建立了管制,以促進這一點。)

另一個選項是在你的代碼隱藏類手動把你的HTML生成的控制和寫整個頁面(而不是使用一個不錯的,易於閱讀的.aspx模板)。要看到這個動作,創建一個完全空白的.aspx(除了@Page聲明),並且把這種在其Page_Load方法:

protected void Page_Load(object sender, EventArgs e) 
{ 
    Response.Write("<html><body><ul>"); 

    // this could be iterating a data reader 
    for(int i=0; i<5; i++) 
    { 
     Response.Write("<li>Item " + i.ToString() + "</li>"); 

     // you might tweak your buffer settings instead of flushing on 
     // each write - this is just for demonstration purposes 
     Response.Flush(); 

     // this just dramatizes the fact that it's streaming 
     // by adding a two-second delay 
     System.Threading.Thread.Sleep(2000); 
    } 
    Response.Write("</ul></body></html>"); 
} 
+0

我在想這些方面。無論如何,它在php和其他web堆棧中都以這種方式工作。謝謝你的時間。 – sash 2010-04-23 14:42:15

0

在這種情況下Response.Write是你的朋友。不幸的是,你會放棄數據綁定和中繼器的細節。這裏是一個鏈接http://highscalability.com/plentyoffish-architecture

+0

感謝您的鏈接。我一直懷疑你必須超越asp.net控件才能在嚴重負載下工作。這只是證實了它。基本上你的和傑夫的答案指出了我應該採取的一般方向,我一定會開始考慮這些方面。 – sash 2010-04-23 14:36:58

2

這將是jQuery的無限滾動一個有趣的解決方案。

http://www.infinite-scroll.com/

因爲,你是不是允許執行分頁您可以滾動罰球也只有這樣的記錄是從數據庫中獲取和顯示。其中一個問題是您需要使用JavaScript動態地將行添加到GridView控件。

將其視爲Google Reader,您可以向下滾動Feed,然後加載所有Feed。

+0

我將探索無限滾動。我在幾個網站中看到了這些實現,這看起來很有前景。萬分感謝。 – sash 2010-04-23 14:39:28