我正在编写ASP.NET服务器控件的ASP.NET方法。该方法使用一个HtmlTextWriter对象来呈现输出内容。对于我正在编写的控件,使用HtmlTextWriter的方法似乎需要大量代码来打开和关闭每个标记,并将每个属性添加到流中。
我在想,如果我使用了像StringBuilder这样的可链接类,那么我的代码阅读起来就容易多了,编写起来也容易多了。
我想知道的是,是否有理由使用HtmlTextWriter对象来呈现整个控件的内容?除了安全检查(我假设)之外,它还包括确保您没有按错误的顺序编写标签或创建无效的标记,我不认为有什么原因。
似乎做这样的事情会更容易:
protected override void RenderContents(HtmlTextWriter output)
{
StringBuilder s = new StringBuilder();
s.Append("lots")
.Append("of")
.Append("strings");
output.BeginRender();
output.Write(s.ToString());
output.EndRender();
}为什么这会是个坏主意呢?
更新
作为对Mehrdad Afshari的回答的回应:
对于单独的StringBuilder对象实例化的内存需求,我没有想太多。如何为HtmlTextWriter制作一个包装器,这样就可以将它链接起来,这样就不会产生额外的字符串了。
public class ChainedHtmlTextWriter
{
private HtmlTextWriter _W;
public ChainedHtmlTextWriter(HtmlTextWriter writer)
{
_W = writer;
}
public ChainedHtmlTextWriter Write<T>(T value)
{
_W.Write(value);
return this;
}
public ChainedHtmlTextWriter WriteLine<T>(T value)
{
_W.WriteLine(value);
return this;
}
}发布于 2009-01-28 22:44:07
我在开发一个应用程序时,开发人员遵循了您正在探索的可怕的路径。这可以追溯到您必须编写自己的ISAPI dll的时候,它会吐出html代码。工作总是令人头痛。如果您的代码主要是字符串,那么就有问题了。
我更改的大多数这种类型的代码都实例化了服务器对象,根据需要配置它们的属性,然后告诉.RenderControl(编写器)。这使得代码更易于阅读和使用。如果这带来的开销影响了性能,我愿意接受它(实际上,在我做了更改之后,应用程序通常运行得更快,所以情况并不是这样,但我还没有分析我的代码)。
硬编码字符串的一个简单缺点是,当HTML标准改变时。我所写的代码是在04/05年编写的,从那以后,就变成了,大写的html标签不再受欢迎,等等。如果他们一直在使用服务器控件,那么这些服务器控件已经改变了它们输出的html,而我们不需要做任何事情。这只是一个简单的例子。
编辑:哦,顺便说一下,BeginRender和EndRender没有任何实现。它们是您在HtmlTextWriter派生类中重写和提供自定义功能的占位符。
EDIT2:有时总是使用服务器控件有点麻烦,比如用于容器和其他东西。我将执行大量的.Controls.Add()操作,然后稍后呈现容器。所以有时候我会这样做:
writer.AddAttribute(HtmlTextWriterAttribute.Class, "myContainerClass");
writer.RenderBeginTag(HtmlTextWriterTag.Div);
// do some stuff, .RenderControl on some other controls, etc.
writer.RenderEndTag();如前所述,即使div的html将来发生变化,也会呈现正确的html,因为我没有任何硬编码字符串。
发布于 2009-01-28 22:32:21
就性能而言,这将需要执行更多的字符串副本。HtmlTextWriter直接写入输出缓冲区。另一方面,StringBuilder有自己的缓冲区。当您在ToString上调用StringBuilder时,必须构建一个新的字符串,然后由output.Write将其写入输出缓冲区。这需要做更多的工作。
发布于 2009-01-28 22:36:29
我认为你不应该打电话给BeginRender/EndRender,这是按页写的。
我看不出使用字符串生成器如何在使用HtmlTextWriters自己的方法之后节省任何工作。
https://stackoverflow.com/questions/489691
复制相似问题