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

时间:2012-01-14 03:42:57

标签: c# asp.net visual-studio visual-studio-2010

到目前为止,我知道我们可以使用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");
}

FYI在DOT.NET中添加字符串非常慢,因此LiteralControl不是一个好选择。

创建StringBuilder并使用

LiteralControl.Text = StringBuilder.ToString()

不是一个选项,因为它会将所有字符串保留在内存中,直到您将其分配给控制并处置它为止。

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

不是一个选项,因为它为我添加到它的每个html块创建了一个LiteralControl,并且它再次使用了大量的内存,对我来说是有限的。

我的Intranet网站在一秒内就有大约500个同一页面的呼叫,它会产生大量的内存使用,使IIS停止响应其他应用程序的请求。

2 个答案:

答案 0 :(得分:1)

到目前为止,我还没有发现这样的内部ASP.NET组件。

对于这件事,我建议3解决方案:

  • 使用传统的Response.Write(...)并用它写一切。 如果您使用的是母版页或其他组件。您可以 在内存中创建一个副本,然后将其部分输出写入Response 缓冲区,然后写下你的部分代码,然后写下其余的页面。
  • 使用第三方组件处理此事
  • 或者编写自己的组件从PlaceHolder继承它并在Render方法中生成输出。它直接将您的输出写入响应缓冲区,并且不使用内存而不是组件代码本身。 (这就是我解决自己类似问题的方法)

还需要考虑的另一件事是,如果您的数据没有太大变化,您可以缓存页面以减少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));