c# stream conventions htmltextwriter

c# - ¿Hay algún beneficio al usar HtmlTextWriter si no va a beneficiarse de la representación adaptativa?



stream conventions (4)

En algún punto, todavía necesita pasar esto a un HtmlTextWriter para poder renderizar al cliente. Supongo que tendrías un escritor final. Escritura (sb.ToString ()); allí en el segundo ejemplo. Lo que puede hacer para reducir las líneas de código es escribir HTML sin procesar, exactamente de la misma manera que en su segundo ejemplo de StringBuilder, pero usando HtmlTextWriter.Write.

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

Entonces, usar un StringBuilder parece innecesario. Y, HtmlTextWriter, al menos hasta cierto punto, se asegurará de que el HTML generado sea compatible (aunque eso no es cierto en el caso anterior, al escribir HTML sin formato).

Además de beneficiarse de la representación adaptativa para dispositivos alternativos, ¿tiene sentido escribir todo este código?

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

Cuando StringBuilder podría construir lo mismo simplemente con esto:

sb.Append("<table><tr><td>"); sb.Append(someTextVariable); sb.Append("</td></tr></table>");


HtmlTextWriter es beneficioso porque:

HtmlTextWriter es el más limpio y el margen de beneficio está muy sangrado cuando se procesa.

Hay un impacto en el rendimiento ya que HtmlTextWriter escribe directamente en la secuencia de salida. Stringbuilder no escribe en la secuencia de salida hasta que se llame a ToString.

Hay un ejemplo de por qué debería usar HtmlTextWriter para guardar y reutilizar la salida HTML aquí también.


Puedo pensar en dos razones para usar HtmlTextWriter: a) puede usar el escritor para realizar un seguimiento de sus sangrías, de modo que su HTML de salida esté formateado muy bien, en lugar de aparecer en una línea yb) HtmlTextWriter generalmente se asocia con una secuencia de salida , por lo que debería ser más eficiente que crear una cadena larga en la memoria (dependiendo de la cantidad de HTML que esté generando).

Ninguno de estos son motivos extraordinarios, pero son suficientes para convencerme de utilizar al escritor cuando se necesita eficiencia, o si estoy escribiendo un control de base que será reutilizado y debe ser lo más profesional posible. Su experiencia puede ser diferente :-).


Otra ventaja podría ser que con HtmlTextWriter uno podría formatear el código de una manera más limpia (más compatible con el mantenimiento), y que HtmlTextWriter admite la codificación de HTML automáticamente. Comparar:

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();

versus:

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

Se puede argumentar que el código en el segundo ejemplo se puede escribir de una manera diferente, posiblemente más limpia, pero esto podría verse como una ventaja de HtmlTextWriter porque básicamente impone una forma canónica de formatear (lo que nuevamente mejora el mantenimiento).

Editar: De hecho, cometí un error en el segundo fragmento, y necesitaba regresar y corregir la respuesta. Esto confirma el punto que quería hacer.