Есть ли какие-либо преимущества в использовании HtmlTextWriter, если вы не собираетесь использовать адаптивный рендеринг?

StackOverflow https://stackoverflow.com/questions/573722

Вопрос

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

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>");
Это было полезно?

Решение

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

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

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

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

Другие советы

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

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

HtmlTextWriter полезен, потому что:

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

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

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

В какой-то момент вам все равно придется передать это в 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).

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top