Y a-t-il des avantages à utiliser HtmlTextWriter si vous n'allez bénéficier d'un rendu d'adaptation?

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

Question

En dehors de bénéficier d'Adaptive rendu pour d'autres périphériques, est-il toujours logique d'écrire tout ce code:

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

Lorsque StringBuilder pourrait construire avec la même chose simplement ceci:

sb.Append("<table><tr><td>");
sb.Append(someTextVariable);
sb.Append("</td></tr></table>");
Était-ce utile?

La solution

Je peux penser à deux raisons d'utiliser HtmlTextWriter:

  1. Vous pouvez utiliser l'écrivain de garder une trace de vos retraits, afin que votre HTML est formaté bien fourni en sortie plutôt que d'apparaître sur une ligne

  2. HtmlTextWriter est généralement associée à un flux de sortie, il devrait donc être plus efficace que la construction d'une longue chaîne en mémoire (selon la quantité de HTML que vous générez).

Aucune de ces raisons sont extraordinaires, mais ils sont assez pour me convaincre d'utiliser l'écrivain lorsque l'efficacité est nécessaire, ou si je suis en train d'écrire un contrôle de base qui sera réutilisée et devrait être aussi professionnel que possible. Votre kilométrage peut varier: -.)

Autres conseils

Un autre avantage pourrait être que l'utilisation d'un HtmlTextWriter pourrait formater le code dans un produit de nettoyage (plus facile à entretenir) façon, et que HtmlTextWriter prend automatiquement en charge HTML de codage. Comparer:

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

par rapport à:

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

On peut faire valoir que le code dans le second exemple peut être écrit dans un autre, peut-être plus propre, manière, mais cela pourrait être considéré comme un avantage de HtmlTextWriter parce qu'il applique essentiellement une façon canonique de la mise en forme (ce qui améliore encore l'entretien) .

Modifier En fait, je réellement fait une erreur dans le second extrait, et je devais revenir en arrière et corriger la réponse. Cela confirme le point que je voulais faire.

HtmlTextWriter est bénéfique parce que:

HtmlTextWriter est la plus propre et la majoration est bien mis en retrait quand il est rendu.

Il y a un impact sur les performances que HtmlTextWriter écrit directement dans le flux de sortie. Stringbuilder ne pas écrire dans le flux de sortie jusqu'à ce que ToString est appelée à ce sujet.

Il est un exemple pourquoi vous utilisez pour HtmlTextWriter Enregistrement et Réutiliser sortie HTML ici.

À un moment donné, vous avez encore besoin de passer à un HtmlTextWriter afin de rendre au client. Je suppose que vous auriez un writer.Write final (sb.ToString ()); là dans le second exemple. Ce que vous pouvez faire pour réduire les lignes de code écrit HTML brut, exactement de la même manière que dans votre deuxième exemple StringBuilder, mais en utilisant à la place HtmlTextWriter.Write.

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

Ensuite, en utilisant un StringBuilder semble inutile. Et, HtmlTextWriter sera, au moins dans une certaine mesure, assurez-vous que le code HTML généré est conforme (sans que cela soit vrai dans le cas ci-dessus, lors de l'écriture HTML brut).

La principale raison pour laquelle je peux penser est d'éviter d'avoir à franchir une étape supplémentaire pour désinfecter votre entrée. Selon les docs, WriteEncodedText formate automatiquement les crochets de façon appropriée.

XSS est une chose réelle, et tout ce que vous pouvez faire pour le rendre plus facile pour les futurs développeurs de maintenir votre code est un avantage.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top