到目前为止,我知道我们可以使用LiteralControl
和PlaceHolder
在运行时动态地向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 :(得分:1)
到目前为止,我还没有发现这样的内部ASP.NET
组件。
对于这件事,我建议3解决方案:
Response.Write(...)
并用它写一切。
如果您使用的是母版页或其他组件。您可以
在内存中创建一个副本,然后将其部分输出写入Response
缓冲区,然后写下你的部分代码,然后写下其余的页面。还需要考虑的另一件事是,如果您的数据没有太大变化,您可以缓存页面以减少IIS上的点击量。
答案 1 :(得分: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));