如果您不想从自适应渲染中受益,使用HtmlTextWriter会有什么好处吗?

时间:2009-02-21 20:49:43

标签: c# stream conventions htmltextwriter

除了备用设备的自适应渲染之外,编写所有这些代码是否有意义:

writer.WriteBeginTag("table");
writer.WriteBeginTag("tr");
writer.WriteBeginTag("td");
writer.Write(HtmlTextWriter.TagRightChar);
writer.WriteEncodedText(someTextVariable);
writer.WriteEndTag("td");
writer.WriteEndTag("tr");
writer.WriteEndTag("table");

当StringBuilder可以简单地构建相同的东西时:

sb.Append("<table><tr><td>");
sb.Append(someTextVariable);
sb.Append("</td></tr></table>");

5 个答案:

答案 0 :(得分:11)

我可以想到使用HtmlTextWriter的两个原因:

  1. 您可以使用编写器来跟踪缩进,以便您输出的HTML格式正确,而不是出现在一行

  2. HtmlTextWriter通常与输出流相关联,因此它应该比在内存中构建长字符串更有效(取决于您生成的HTML数量)。

  3. 这些都不是特别的原因,但它们足以说服我在需要效率时使用作者,或者如果我正在编写一个可以重复使用并且应该尽可能专业的基础控件。您的里程可能会有所不同: - )。

答案 1 :(得分:11)

另一个优势可能是使用HtmlTextWriter可以以更清晰(更易于维护)的方式格式化代码,并且HtmlTextWriter支持自动编码HTML。比较:

writer.AddAttribute(HtmlTextWriterAttribute.Id, "someId");
if (!string.IsNullOrEmpty(cssClass)) writer.AddAttribute(HtmlTextWriterAttribute.Class, cssClass);
writer.AddStyleAttribute(HtmlTextWriterStyle.Color, "Red");
writer.RenderBeginTag(HtmlTextWriterTag.Span);
writer.WriteEncodedText(text);
writer.RenderEndTag();

StringBuilder html = new StringBuilder();
html.Append("<span");
html.Append(" id=\"someId\"");
if (!string.IsNullOrEmpty(cssClass)) html.AppendFormat(" class=\"{0}\"", HttpUtility.HtmlAttributeEncode(cssClass));
html.Append(">");
html.Append(HttpUtility.HtmlEncode(text));
html.Append("</span>");

有人可能会争辩说第二个例子中的代码可以用不同的,可能更清晰的方式编写,但这可以看作是HtmlTextWriter的一个优点,因为它基本上强制执行一种规范的格式化方式(这再次提高了维护性)

编辑:事实上,我实际上在第二个片段中犯了一个错误,我需要回过头来修复响应。这证实了我想提出的观点。

答案 2 :(得分:6)

HtmlTextWriter是有益的,因为:

HtmlTextWriter是最干净的,标记在渲染时很好地缩进。

HtmlTextWriter直接写入输出流会对性能产生影响。在调用ToString之前,Stringbuilder不会写入输出流。

有一个例子说明为什么你会在这里使用HtmlTextWriter Saving and Reusing HTML Output

答案 3 :(得分:2)

在某些时候,您仍然需要将此传递给HtmlTextWriter才能呈现给客户端。我想你会有一个最终的writer.Write(sb.ToString());在第二个例子中。 你可以做些什么来减少代码行是编写原始HTML,与第二个StringBuilder示例完全相同,但改为使用HtmlTextWriter.Write。

writer.Write("<table><tr><td>");
writer.Write(someTextVariable);
writer.Write("</td></tr></table>");

然后使用StringBuilder似乎没必要。 并且,HtmlTextWriter将至少在某种程度上确保生成的HTML符合要求(尽管在上述情况下,在编写原始HTML时不是这样)。

答案 4 :(得分:1)

我能想到的最大原因是避免采取额外的步骤来清理您的输入。根据文档,WriteEncodedText将自动格式化任何尖括号。

XSS是一件实事,而您可以做的使将来的开发人员更轻松地维护代码的任何事情都是有好处的。