Существуют ли какие-либо преимущества при использовании 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>");
Ответы
Ответ 1
Я могу думать о двух причинах использования HtmlTextWriter: а) вы можете использовать автора для отслеживания ваших отступов, чтобы ваш выводимый HTML был отформатирован красиво, а не появлялся на одной строке и b) HtmlTextWriter обычно ассоциируется с выходной поток, поэтому он должен быть более эффективным, чем создание длинной строки в памяти (в зависимости от того, сколько HTML вы создаете).
Ни один из них не является экстраординарными причинами, но их достаточно, чтобы убедить меня использовать автора, когда нужна эффективность, или если я пишу базовый элемент управления, который будет использоваться повторно и должен быть максимально профессиональным. Ваш пробег может отличаться: -).
Ответ 2
Другим преимуществом может быть то, что с помощью 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, поскольку он в основном обеспечивает один канонический способ форматирования (что опять улучшает обслуживание).
Изменить: На самом деле, я действительно допустил ошибку во втором фрагменте, и мне нужно было вернуться и исправить ответ. Это подтверждает тот момент, который я хотел сделать.
Ответ 3
HtmlTextWriter полезен, потому что:
HtmlTextWriter является самым чистым, и надпись красиво отступы, когда она отображается.
Возникает влияние производительности, поскольку HtmlTextWriter записывает непосредственно в выходной поток. Stringbuilder не записывает в выходной поток, пока на него не вызывается ToString.
Существует пример того, почему вы также используете HtmlTextWriter для Сохранение и повторное использование HTML-вывода.
Ответ 4
В какой-то момент вам все равно нужно передать это в HtmlTextWriter для рендеринга клиенту. Думаю, у вас будет последний писатель. Запишите (sb.ToString()); там, во втором примере.
Что вы можете сделать, чтобы уменьшить количество строк кода, это писать необработанный HTML, точно так же, как в вашем втором примере StringBuilder, но вместо этого используйте HtmlTextWriter.Write.
writer.Write("<table><tr><td>");
writer.Write(someTextVariable);
writer.Write("</td></tr></table>");
Тогда использование StringBuilder кажется ненужным.
И, HtmlTextWriter, по крайней мере, до некоторой степени, убедится, что сгенерированный HTML является совместимым (хотя это не так в приведенном выше случае при написании необработанного HTML).