15

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

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>");
4

5 回答 5

12

另一个优点可能是使用 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 的一个优势,因为它基本上强制执行一种规范的格式化方式(这再次改进了维护)。

编辑:事实上,我实际上在第二个片段中犯了一个错误,我需要返回并修复响应。这证实了我想表达的观点。

于 2009-04-07T06:36:41.133 回答
11

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

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

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

这些都不是特别的原因,但它们足以说服我在需要效率时使用编写器,或者如果我正在编写一个将被重用并且应该尽可能专业的基本控件。你的旅费可能会改变 :-)。

于 2009-02-21T21:03:24.333 回答
6

HtmlTextWriter 是有益的,因为:

HtmlTextWriter 是最干净的,并且标记在呈现时缩进很好。

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

这里还有一个例子说明为什么你会使用 HtmlTextWriter 来保存和重用 HTML 输出

于 2009-02-21T21:14:47.097 回答
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 时,情况并非如此)。

于 2009-02-21T21:02:55.643 回答
1

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

XSS是一个真实的东西,你可以做的任何事情来让未来的开发者更容易维护你的代码是一种好处。

于 2019-03-05T13:59:19.447 回答