是否有任何asp.net组件需要编写而不是添加
本文关键字:添加 任何 asp net 组件 是否 | 更新日期: 2023-09-27 18:20:12
到目前为止,我知道我们有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");
}
仅供参考,在DOT.NET
中添加到字符串的速度非常慢,因此LiteralControl
不是一个好的选择。
创建StringBuilder并使用
LiteralControl.Text = StringBuilder.ToString()
不是一个选项,因为它会将所有字符串保存在内存中,直到您将其分配给控制和处理它
PlaceHolder.Controls.Add(new LiteralControl("Some HTML/Text"))
不是一个选项,因为它为我添加到其中的每个html块创建一个LiteralControl,而且它使用了大量内存,这对我来说是有限的。
我的Intranet网站在一秒钟内有大约500次对同一页面的调用,它会产生内存使用量的巨大峰值,使IIS停止响应对其他应用程序的请求。
到目前为止,我还不知道有这样的内部ASP.NET
组件。
对于这个问题,我建议3个解决方案:
- 使用传统的
Response.Write(...)
并用它编写所有内容。如果您正在使用母版页或有一些其他组件。你可以在内存中创建一个副本,然后将其部分输出写入响应缓冲区,然后编写您的代码部分,然后编写页面的其余部分 - 使用第三方组件处理此问题
- 或者编写您自己的组件从PlaceHolder继承它,并在Render方法中生成输出。它直接将您的输出写入响应缓冲区,并且只使用组件代码本身,而不使用内存。(这就是我解决类似问题的方法)
需要考虑的另一件事是,如果你的数据没有太大变化,你可以缓存你的页面,以减少对IIS的点击。
对于为每个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));