2012-01-14 46 views
1

到目前爲止,我知道我們有LiteralControlPlaceHolder,我們可以在運行時動態地將控件添加到ASP.NET頁面。是否有任何asp.net組件可以編寫而不是添加

將HTML代碼添加到LiteralControl我們使用

LiteralControl.Text = "Some HTML/Text" 

PlaceHolder我們使用

PlaceHolder.Controls.Add(new LiteralControl("Some HTML/Text")) 

我在尋找我可以寫它像什麼我Response.Write(...)做一個組成部分但我需要它在頁面中的指定位置寫入。我需要多次調用才能發送小塊html代碼來輸出以節省內存。

,表示該部件的使用將是這樣的:

在aspx頁面我會把:

<body> 
... 
<div> 
<asp:componentName ID="SomeComp" runat="server" /> 
</div> 
... 
</body> 

而且在後面的我的代碼,我將使用這個(試想一個大數目對於SetCount):

for (int i;i<SetCount;i++){ 
    SomeComp.Write("Some Text/HTML Code"); 
} 
While(Read.Read()){ 
    SomeComp.Write("Some More Text/HTML Code"); 
} 

FYI添加到字符串DOT.NET非常緩慢,LiteralControl是不是一個好的選擇。

創建的StringBuilder和使用

LiteralControl.Text = StringBuilder.ToString() 

是不是一種選擇,因爲它在內存中保存的所有字符串,直到你給它分配的控制和處置它。

PlaceHolder.Controls.Add(new LiteralControl("Some HTML/Text")) 

是不是一種選擇,因爲它創造了HTML的每個塊我給它添加一個LiteralControl和它再次使用大量的內存,對我來說是有限的。

我的Intranet網站每秒約有500次調用同一頁面,它會在內存使用中產生巨大的峯值,使IIS停止響應其他應用程序的請求。

+0

也許在jQuery中使用'div'會有幫助嗎? – 2012-01-14 03:46:41

+0

所以你想要LiteralControl的行爲,但更快?由於它的渲染調用只是output.Write(this._text),我不確定你將如何變得更快,並且仍然是一個(行爲良好的)控件。或許<%= foo %>會更適合你? – 2012-01-14 05:57:41

+1

@JamesManning,謝謝你的想法,'LiteralControl'很快,但是它的輸入是字符串,並且向該輸出添加了字符串'+'。我相信你知道'DOT.NET'處理字符串的速度很慢。我正在看的案例是LiteralControl.Append('Some HTML/Text'),它直接寫入頁面中的指定區域。 – AaA 2012-01-15 04:08:01

回答

1

到目前爲止,我不知道這樣的內部ASP.NET組件。

對於這件事,我建議3溶液:

  • 使用傳統Response.Write(...)和寫入的一切。 如果您使用母版頁或有其他組件。你可以在內存中創建一個副本,然後將其部分輸出寫入響應 緩衝區,然後編寫代碼的一部分,然後寫入頁面的其餘部分。
  • 使用第三方組件處理此事
  • 或者編寫自己的組件繼承它從PlaceHolder並在Render方法中生成輸出。它直接將輸出寫入響應緩衝區,而不是使用內存而不是組件代碼本身。 (這是我如何解決我自己的類似的問題)

還有一兩件事要考慮的是,如果你的數據是沒有改變很多,你可以緩存你的頁面,以減少對IIS命中了。

0

用於創建每個HTML元素的單LiteralControl對象的問題,你可以使用Html32TextWriter首先使所有的HTML元素,然後用LiteralControl把它放在網頁上:

var sb = new StringBuilder(); 
    var writer = new StringWriter(sb); 
    var html = new Html32TextWriter(writer); 

    html.RenderBeginTag(HtmlTextWriterTag.P); 
    html.WriteEncodedText("paragraph1"); 
    html.RenderEndTag(); 
    ... 
    ... 
    html.Flush(); 

    var outputHtml = sb.ToString(); 

    placeHolder.Controls.Add(new LiteralControl(outputHtml)); 
+0

請仔細閱讀我的問題!我所說的爲我添加到「PlaceHolder」的每個html代碼塊創建一個文字控件是我的一個缺點,這意味着我不希望這樣! 正如我所解釋的,我喜歡在輸出中添加小塊html代碼,以減少服務器中的內存使用量,並且比添加到HTTP緩衝區之前在內存中添加大字符串更快。 – AaA 2012-01-15 04:03:13

+0

我並不是指使用幾個LiteralControl,因爲我說你可以使用HtmlTextWriter構建你想要的所有元素,並在最後得到相應的html輸出並將其添加爲「單個」LiteralControl。 如果你的意思是如何使用「無緩衝的響應」在服務器上有一個較小的響應緩衝區,那麼這是一個完全不同的問題。 – sos00 2012-01-15 04:23:21

+0

您可以直接使用'StringBulder.ToString()'。所以你的解決方案會更容易與sb.Appent(「...」); placeHolder.Controls.Add(新的LiteralControl(sb.ToString())); IIS緩衝區內存不是一個大問題,ASP.NET內存是更大的問題。我的ASP.NET進程有時會消耗1個。我的記憶和ISS只有5gig同時使用200megs。 – AaA 2012-01-15 04:55:11

相關問題