¿Hay ventajas a usar HtmlTextWriter si no se va a beneficiarse de la prestación de adaptación?

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

Pregunta

Fuera de beneficiarse de Prestación de adaptación para dispositivos alternativos, no es que alguna vez sentido para escribir todo de 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 con simplemente esto:

sb.Append("<table><tr><td>");
sb.Append(someTextVariable);
sb.Append("</td></tr></table>");
¿Fue útil?

Solución

Se me ocurren dos razones para utilizar HtmlTextWriter:

  1. Puede utilizar el escritor de mantener un registro de sus guiones, de modo que el código HTML como salida se formatea bien, en lugar de aparecer en una línea

  2. HtmlTextWriter por lo general se asocia con un flujo de salida, por lo que debe ser más eficiente que la construcción de una larga cadena en la memoria (dependiendo de la cantidad de HTML que está generando).

Ninguno de estos son razones extraordinarias, pero son suficientes para convencerme de usar el escritor cuando se necesita eficiencia, o si estoy escribiendo un control de la base que será reutilizado y debe ser lo más profesional posible. Su experiencia puede variar: -).

Otros consejos

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

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

frente a:

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 podría argumentar que el código en el segundo ejemplo se puede escribir en una, posiblemente más limpio, de manera diferente, pero esto podría ser visto como una ventaja de HtmlTextWriter porque básicamente hace cumplir de un modo canónico de formato (que a su vez mejora el mantenimiento) .

Editar De hecho, en realidad cometió un error en el segundo fragmento, y que tenía que volver atrás y corregir la respuesta. Esto confirma el punto que quería hacer.

HtmlTextWriter es beneficioso debido a que:

HtmlTextWriter es el más limpio y el margen de beneficio está muy bien sangría cuando se representa.

Hay un impacto en el rendimiento como HtmlTextWriter escribe directamente en el flujo de salida. StringBuilder no escribe en el flujo de salida hasta ToString se llama en ella.

No es un ejemplo de por qué se usaría para HtmlTextWriter Almacenamiento y reutilización de salida HTML aquí también.

En algún momento, usted todavía tiene que pasar esto a un HtmlTextWriter el fin de hacer al cliente. Supongo que tendría un writer.Write final (sb.ToString ()); allí en el segundo ejemplo. Lo que puede hacer para reducir las líneas de código está escribiendo HTML puro, exactamente de la misma manera que en el segundo ejemplo StringBuilder, pero utilizando HtmlTextWriter.Write lugar.

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

A continuación, utilizando un StringBuilder parece innecesario. Y, HtmlTextWriter será, al menos en cierta medida, asegúrese de que el HTML generado es compatible (aunque eso no es cierto en el caso anterior, al escribir el HTML puro).

La mayor razón por la que puedo pensar es evitar tener que tomar un paso adicional para desinfectar su entrada. De acuerdo con la documentación, WriteEncodedText dará formato automáticamente los paréntesis angulares adecuadamente.

XSS es una cosa real, y cualquier cosa que puedas hacer para que sea más fácil para los futuros desarrolladores para mantener su código es un beneficio.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top