Есть ли какие-то преимущества в использовании 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>");

person Chris Ballance    schedule 21.02.2009    source источник
comment
См. здесь stackoverflow.com/ вопросы/489691/   -  person Daniel Little    schedule 06.07.2011


Ответы (5)


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

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

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

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

person tsimon    schedule 21.02.2009
comment
привет Не могли бы вы помочь, я хочу отобразить вывод HTmltextwriter в шаблоне электронной почты Outlook в новом окне. когда я попробовал, теги HTML не отображаются должным образом ‹43›‹41›‹/41›‹12›‹25›Привет мир!!!‹/25›‹/12›‹/43› ...следующие числа не должны появляться..подскажите пожалуйста - person clarifier; 27.02.2018

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

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

person Jan Zich    schedule 07.04.2009

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

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

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

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

person cgreeno    schedule 21.02.2009
comment
Привет, я хочу отобразить вывод HTmltextwriter в шаблоне электронной почты Outlook в новом окне. Когда я попробовал, теги HTML не отображаются должным образом ‹43›‹41›‹/41›‹12›‹25›Hello world!!! ‹/25›‹/12›‹/43› - person clarifier; 27.02.2018

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

person baretta    schedule 21.02.2009

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

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

person Dan Esparza    schedule 05.03.2019