2010-06-15 16 views

risposta

61

TagBuilder è una classe appositamente progettata per la creazione di tag HTML e il loro contenuto. Hai ragione dicendo che il risultato sarà comunque una stringa e ovviamente puoi ancora utilizzare StringBuilder e il risultato sarà lo stesso, ma puoi fare le cose più facilmente con TagBuilder. Diciamo è necessario generare un tag:

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

Utilizzando StringBuilder è necessario scrivere qualcosa del genere:

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

Non è molto cool, non è vero? E confronta come puoi costruirlo usando TagBuilder;

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

Non è meglio?

+1

Nota che ha chiesto di costruire un tavolo, cioè è probabilmente un tavolo di nidificazione, e quindi più trs e tds. Non avrà bisogno di un tagbuilder per ognuno di questi? Mi aspetto che diventi molto più complicato del costruttore di stringhe equivalente. – Rup

15

È solo la convenienza. Da this tutorial:

Non è proprio necessario utilizzare la classe TagBuilder. È possibile utilizzare una classe StringBuilder . Tuttavia, la classe TagBuilder ti semplifica la vita.

Guarda i metodi su TagBuilder e pensa se ti danno un valore. vorresti fare la stessa cosa manualmente in StringBuilder ogni volta? Esiste la fuga che fa per te? Unione di attributi, ecc.? Il codice risultante è più facile da leggere, rendendo più chiaro che stai costruendo un tag piuttosto che una stringa arbitraria?

+1

Penso che l'utilizzo di TagBuilder vanifica lo scopo di MVC. Stai mescolando codice e markup per brevità a spese di modifiche più semplici. –

+8

@Joel Rodgers TagBuilder ha il suo posto in 'HtmlHelpers' –

+0

E un certo punto ti arrabbieresti con il tag builder e implementerai il tuo in cui riutilizzi principalmente il tag builder. –

8

non stanno generando la stessa cosa ??

Beh, certo, ma questo non dovrebbe essere un deterrente, dovrebbe? Una classe è progettata per qualcosa di più specifico dell'altro, quindi offre un maggiore livello di praticità.

Potrei chiedere: perché utilizzare un StringBuilder? Perché non uno List<char>? Non potrei generare la stessa cosa da entrambi?

Un passo avanti: perché anche un List<char>? Perché non solo un char[], il ridimensionamento/la manipolazione di cui posso controllarmi? Posso ancora creare completamente un string da un char[].

In effetti, tutto ciò di cui ho veramente bisogno è uno char* e uno int (per la lunghezza). Destra?

Il mio punto è che se una classe è disponibile per funzionalità specializzate che è possibile utilizzare, ha senso utilizzarla se me lo chiedi.

0

Non dimenticare di eseguire la codifica HTML dei valori se si utilizza StringBuilder. Spero che TagBuilder faccia questo automaticamente.

+2

SetInnerText codificherà la stringa. – SwampyFox

11

C'è un punto che le altre risposte hanno mancato finora. Se si restituisce TagBuilder da un metodo di estensione è possibile continuare ad aggiungere attributi nella vista. Supponiamo che tu stia restituendo una tabella da un helper Html e vuoi aggiungere un attributo di classe. Se stai usando un StringBuilder devi passare la classe come parametro.

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

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

Ma l'aggiunta di un attributo di classe per un tag HTML è non la preoccupazione di un metodo di estensione che crea una tabella! Se passiamo a un modello semantico (TagBuilder) per generare l'HTML, possiamo aggiungere l'attributo class al di fuori del metodo table.

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

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

Oltre a TagBuilder, si potrebbe voler controllare biblioteca HtmlTags di FubuMVC. È un modello molto migliore per generare HTML. Ho un po 'di more details sul blog.

1

Come è menzionato negli altri post, TagBuilder porta un po 'di praticità. Ma dovresti considerare che TagBuilder e StringBuilder potrebbero non produrre lo stesso risultato. TagBuilder applica la codifica html, ma StringBuilder no. Quindi è più sicuro usare TagBuilder per superare le vulnerabilità che possono essere sfruttate tramite un attacco XSS.

Problemi correlati