2010-06-15 17 views

Respuesta

61

TagBuilder es una clase especialmente diseñada para crear etiquetas html y su contenido. Tiene razón al decir que el resultado será de todos modos una cadena y, por supuesto, todavía puede usar StringBuilder y el resultado será el mismo, pero puede hacer las cosas más fácilmente con TagBuilder. Digamos que necesita para generar una etiqueta:

<a href='http://www.stackoverflow.com' class='coolLink'/> 

Usando StringBuilder tiene que escribir algo como esto:

var sb = new StringBuilder(); 
sb.Append("<a href='"); 
sb.Append(link); 
sb.Append("' class = '"); 
sb.Append(ccsClass); 
sb.Append("'/>"); 
sb.ToString(); 

No es muy fresco, ¿no es así? Y compara cómo puedes construirlo usando TagBuilder;

var tb = new TagBuilder("a"); 
tb.MergeAttribute("href",link); 
tb.AddCssClass(cssClass); 
tb.ToString(TagRenderMode.SelfClosing); 

¿No es eso mejor?

+1

Tenga en cuenta que le preguntó sobre la construcción de una mesa, es decir, probablemente sea mesa de anidación, tbody y luego varias trs y tds. ¿No necesitará un creador de etiquetas para cada uno de esos? Supongo que será mucho más desordenado que el generador de cuerdas equivalente. – Rup

15

Es solo la comodidad. De this tutorial:

Realmente no necesita utilizar la clase TagBuilder. En su lugar, podría utilizar una clase StringBuilder . Sin embargo, la clase TagBuilder hace su vida un poco más fácil.

vistazo a los métodos de TagBuilder, y pensar si se da valor. ¿Le gustaría hacer lo mismo usted mismo manualmente en StringBuilder cada vez? ¿Hay escapatoria que lo haga por ti? Fusión de atributos, etc. ¿El código resultante es más fácil de leer, por lo que es más claro que está creando una etiqueta en lugar de una cadena arbitraria?

+1

Creo que usar TagBuilder derrota el propósito de MVC. Está mezclando código y marcado en aras de la brevedad a expensas de una modificación más fácil. –

+8

@Joel Rodgers TagBuilder tiene su lugar en 'HtmlHelpers' –

+0

Y en algún momento te enojarás con el generador de etiquetas e implementarás el tuyo propio, donde principalmente reutilizas el creador de etiquetas. –

8

¿no están generando lo mismo?

Bueno, claro, pero eso no debería ser un impedimento, ¿o sí? Una clase está diseñada para algo más específico que la otra, por lo que ofrece un mayor nivel de conveniencia.

Podría preguntar: ¿por qué usar un StringBuilder? ¿Por qué no un List<char>? ¿No podría generar lo mismo de cualquiera?

Yendo un paso más allá: ¿por qué incluso un List<char>? ¿Por qué no solo un char[], cuyo cambio de tamaño/manipulación puedo controlar yo mismo? Todavía puedo crear totalmente un string desde un char[].

De hecho, todo lo que realmente necesito es un char* y un int (para longitud). ¿Derecha?

Mi punto es que si hay una clase disponible para la funcionalidad especializada que puede usar, tiene sentido usarla si me pregunta.

0

No olvide hacer una codificación HTML de valores si está utilizando StringBuilder. Espero que TagBuilder haga esto automáticamente.

+2

SetInnerText codificará la cadena. – SwampyFox

11

Hay un punto que las otras respuestas han omitido hasta ahora. Si devuelve TagBuilder desde un método de extensión, puede continuar agregando atributos en su vista. Supongamos que devuelve una tabla de un helper Html y desea agregar un atributo de clase. Si está usando un StringBuilder, necesita pasar la clase como parámetro.

public static string Table(...., string @class) 
{ 
    ... 
    sb.AppendFormat("class='{0}", @class); 
    ... 
} 

// In the view 
<%: Html.Table(someParams, "fancy") %> 

embargo, la adición de un atributo de clase de una etiqueta HTML es no la preocupación de un método de extensión que crea una tabla! Si cambiamos a un modelo semántico (TagBuilder) para generar el HTML, podemos agregar el atributo de clase fuera del método de tabla.

public static TagBuilder Table(....) 
{ 
    ... 
    return tag; 
} 

// In the view 
<%: Html.Table(someParams).AddCssClass("fancy") %> 

Además de TagBuilder, es posible que desee leer la sección de HtmlTags FubuMVC. Es un modelo mucho mejor para generar HTML. Tengo algunos more details en el blog.

1

Como se menciona en las otras publicaciones, TagBuilder ofrece cierta comodidad. Pero debe considerar que TagBuilder y StringBuilder pueden no producir el mismo resultado. TagBuilder aplica codificación html, pero StringBuilder no lo hace. Por lo tanto, es más seguro usar TagBuilder para superar las vulnerabilidades que pueden explotarse a través del ataque XSS.

Cuestiones relacionadas