Há algum benefício para usando HtmlTextWriter se você não está indo para beneficiar da prestação de adaptação?

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

Pergunta

Fora de beneficiar Adaptive Rendering para dispositivos alternativos, ele nunca faz sentido para escrever tudo isso 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");

Quando StringBuilder poderia construir a mesma coisa com simplesmente esta:

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

Solução

Não consigo pensar em duas razões para usar HtmlTextWriter:

  1. Você pode usar o escritor a acompanhar os seus travessões, de modo que o seu HTML outputted é formatado bem, em vez de aparecer em uma linha

  2. HtmlTextWriter é geralmente associada a um fluxo de saída, por isso deve ser mais eficiente do que a construção de uma longa seqüência na memória (dependendo de quanto HTML você está gerando).

Nem estas são razões extraordinárias, mas eles são o suficiente para me convencer a usar o escritor quando a eficiência é necessária, ou se eu estou escrevendo um controle de base que será reutilizado e deve ser o mais profissional possível. Sua milhagem pode variar: -).

Outras dicas

Outra vantagem pode ser que usando um HtmlTextWriter poderia formatar código de uma maneira mais limpa (mais manutenção amigável), e que os suportes HtmlTextWriter codificação HTML automaticamente. 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();

contra:

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

Pode-se argumentar que o código no segundo exemplo, pode ser escrita de uma forma diferente, possivelmente limpo, forma, mas isto pode ser visto como uma vantagem de HtmlTextWriter porque basicamente impõe uma forma canónica de formatação (que por sua vez melhora a manutenção) .

Editar: Na verdade, eu realmente cometi um erro no segundo trecho, e eu precisava voltar e corrigir a resposta. Isto confirma o ponto que eu queria fazer.

HtmlTextWriter é benéfico porque:

HtmlTextWriter é o mais limpo eo mark-up é muito bem recuado quando ele é processado.

Há um impacto no desempenho como HtmlTextWriter escreve diretamente para o fluxo de saída. não stringbuilder não gravar o fluxo de saída até ToString é chamado sobre ele.

Há um exemplo de por que você iria usar HtmlTextWriter para Economia e reutilização de HTML Output aqui também.

Em algum momento, você ainda precisa passar isso para um HtmlTextWriter a fim de tornar para o cliente. Eu acho que você teria um writer.Write final (sb.ToString ()); ali, no segundo exemplo. O que você pode fazer para reduzir as linhas de código está escrevendo HTML cru, exatamente da mesma forma como no seu segundo exemplo StringBuilder, mas usando HtmlTextWriter.Write vez.

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

Em seguida, usando um StringBuilder parece desnecessária. E, HtmlTextWriter vai, pelo menos até certo ponto, verifique se o HTML gerado é compatível (embora isso não é verdade no caso acima, ao escrever HTML puro).

A maior razão que eu posso pensar é para evitar ter que dar um passo extra para higienizar sua entrada. De acordo com os documentos, WriteEncodedText irá formatar automaticamente os colchetes de forma adequada.

XSS é uma coisa real, e tudo o que puder fazer para tornar mais fácil para os futuros devs para manter seu código é um benefício.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top