2012-01-14 16 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

相关问题