是否有任何asp.net组件需要编写而不是添加

本文关键字:添加 任何 asp net 组件 是否 | 更新日期: 2023-09-27 18:20:12

到目前为止,我知道我们有LiteralControlPlaceHolder,可以在运行时使用它们向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组件需要编写而不是添加

到目前为止,我还不知道有这样的内部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));
相关文章: