使用的HtmlTextWriter来渲染服务器控件?
-
20-08-2019 - |
题
我在写我的ASP.NET服务器控件的RenderContents()
方法。该方法使用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();
}
是否有任何理由,这将是一个坏主意?
<强>更新强>结果
在回答的迈赫达德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;
}
}
解决方案
我在一个应用程序,开发者跟着你正在探索可怕的路径工作。这让人回想起当你不得不写吐出HTML代码自己ISAPI的dll的日子。这是一个常数头痛的工作。如果你的代码大部分是字符串,那么什么是错的。
大多数这种类型的我改变我实例服务器对象,如所期望的配置属性,然后告诉他们.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();
如前所述,这将使正确的HTML即使在未来一个div变化的HTML,因为我没有任何硬编码字符串。
其他提示
性能方面,这将需要更多的字符串拷贝工作要做。 HtmlTextWriter
直接写入到输出缓冲器中。在另一方面StringBuilder
,有它自己的缓冲区。当你调用ToString
在StringBuilder
,一个新的字符串,必须建立,然后它会被写入到由output.Write
输出缓冲区。这需要做大量的工作。
我不认为你应该被调用BeginRender / EndRender,多数民众赞成在页面完成。
我无法看到如何使用字符串生成器会保存所有工作在使用HtmlTextWriters自己的方法。