2012-03-23 56 views
2

同花順,我想使用某種逐步呈現在三夏,這裏有一個例子(沒有工作像預想的那樣)使用響應中的WebControl

public class Price : WebControl 
{ 

    protected override void Render(HtmlTextWriter output) 
    { 
     HttpResponseBase response = new HttpResponseWrapper(new HttpResponse(output)); 

     //Panel basePanel = new Panel() { ID = "basePanel" }; 
     //Controls.Add(basePanel); 
     //var loaderImage = LoaderAnimation(); 
     //Controls.Add(loaderImage); 

     System.Threading.Thread.Sleep(500); 
     Controls.Add(new LiteralControl("aaa ")); 
     response.Flush(); 

     System.Threading.Thread.Sleep(500); 
     Controls.Add(new LiteralControl("bbb ")); 
     response.Flush(); 

     System.Threading.Thread.Sleep(500); 
     Controls.Add(new LiteralControl("ccc ")); 

     base.RenderContents(output); 
    } 
} 

這應該在每次刷新渲染。也許這是一個可怕的技術,但我愛這個建議。

回答

3

您的方法可能無法按預期工作。如果你想逐步渲染(我不是問爲什麼),你應該解決類似AJAX

有太多的參與(網絡,客戶端和服務器端的緩衝,在瀏覽器中呈現非常依賴於當前等其他元素的結束標記),您可以使用一種方法,只需暫停間歇地生成內容。

如果您想要在服務器上顯示類似服務器進程的進程,請讓其他後臺線程完成該任務,讓客戶端每隔X秒輪詢一次更新。 JSON和AJAX是您的朋友,您可以向用戶展示緩慢增長的頁面/內容。

這樣做的效果是,您可以先渲染整個頁面(即包含html結束標記的有效HTML),然後更新HTML頁面中間的部分。

1

要做到這一點你試圖,你需要呈現控制(可能).ToString()調用。然後,在調用response.Flush()之前調用response.Write(yourString)。

艾貝爾提到的方法是,國際海事組織,一個更好的。

此博客文章指出您需要兩次調用response.Flush ...這可能與您正在做的事情一起工作。當我需要做類似的事情時,我使用了Abel的方法。

http://blogs.microsoft.co.il/blogs/itai/archive/2009/02/08/improve-your-asp-net-website-user-experience-flush-down-your-partial-response.aspx