Есть ли какие-либо преимущества использования HtmlTextWriter, если вы не собираетесь использовать адаптивный рендеринг? - PullRequest
15 голосов
/ 21 февраля 2009

Помимо использования адаптивного рендеринга для альтернативных устройств, имеет ли смысл когда-либо писать весь этот код:

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 ]

11 голосов
/ 07 апреля 2009

Еще одним преимуществом может быть то, что с помощью 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, потому что он в основном обеспечивает один канонический способ форматирования (что снова улучшает обслуживание) .

Редактировать: На самом деле, я действительно допустил ошибку во втором фрагменте, и мне нужно было вернуться и исправить ответ. Это подтверждает то, что я хотел сделать.

11 голосов
/ 22 февраля 2009

Я могу подумать о двух причинах использования HtmlTextWriter:

  1. Вы можете использовать средство записи для отслеживания ваших отступов, чтобы ваш выводимый HTML форматировался красиво, а не появлялся в одной строке

  2. HtmlTextWriter обычно связан с выходным потоком, поэтому он должен быть более эффективным, чем создание длинной строки в памяти (в зависимости от того, сколько HTML-кода вы генерируете).

Ни одна из этих причин не является экстраординарной, но их достаточно, чтобы убедить меня использовать писателя, когда требуется эффективность, или если я пишу базовый элемент управления, который будет использоваться повторно и должен быть максимально профессиональным. Ваш пробег может варьироваться: -).

6 голосов
/ 22 февраля 2009

HtmlTextWriter выгоден, потому что:

HtmlTextWriter является самым чистым, а разметка имеет хорошие отступы при визуализации.

Это влияет на производительность, так как HtmlTextWriter пишет напрямую в выходной поток. Stringbuilder не выполняет запись в выходной поток до тех пор, пока для него не будет вызвана ToString.

Здесь приведен пример того, почему вы должны использовать HtmlTextWriter для Сохранения и повторного использования вывода HTML и здесь.

2 голосов
/ 22 февраля 2009

В какой-то момент вам все еще нужно передать это в HtmlTextWriter для рендеринга клиенту. Я предполагаю, что у вас будет финальный писатель. Write (sb.ToString ()); во втором примере. Чтобы уменьшить количество строк кода, вы можете писать необработанный HTML, точно так же, как во втором примере с StringBuilder, но вместо этого использовать HtmlTextWriter.Write.

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

Тогда использование StringBuilder кажется ненужным. И HtmlTextWriter, по крайней мере, до некоторой степени, обеспечит соответствие сгенерированного HTML-кода (хотя это не так в вышеописанном случае при написании необработанного HTML).

1 голос
/ 05 марта 2019

Самая большая причина, по которой я могу придумать, состоит в том, чтобы избежать необходимости делать дополнительный шаг для дезинфекции вашего ввода. Согласно документам, WriteEncodedText автоматически отформатирует любые угловые скобки соответствующим образом.

XSS - это реальная вещь, и все, что вы можете сделать, чтобы облегчить будущим разработчикам поддержку вашего кода, является преимуществом.

...