Quelle est la différence entre l'utilisation de tag builder et de string builder pour créer une table dans une classe htmlhelper, ou l'utilisation de HtmlTable ?
ne génèrent-ils pas la même chose ??
Quelle est la différence entre l'utilisation de tag builder et de string builder pour créer une table dans une classe htmlhelper, ou l'utilisation de HtmlTable ?
ne génèrent-ils pas la même chose ??
TagBuilder
est une classe spécialement conçue pour créer des balises html et leur contenu. Vous avez raison de dire que le résultat sera de toute façon une chaîne de caractères et bien sûr vous pouvez toujours utiliser StringBuilder
et le résultat sera le même, mais vous pouvez faire les choses plus facilement avec TagBuilder
. Disons que vous devez générer une balise :
<a href='http://www.stackoverflow.com' class='coolLink'/>
Utilisation de StringBuilder
vous devez écrire quelque chose comme ça :
var sb = new StringBuilder();
sb.Append("<a href='");
sb.Append(link);
sb.Append("' class = '");
sb.Append(ccsClass);
sb.Append("'/>");
sb.ToString();
Ce n'est pas très cool, n'est-ce pas ? Et comparez comment vous pouvez le construire en utilisant TagBuilder
;
var tb = new TagBuilder("a");
tb.MergeAttribute("href",link);
tb.AddCssClass(cssClass);
tb.ToString(TagRenderMode.SelfClosing);
N'est-ce pas mieux ?
C'est juste une question de commodité. De ce tutoriel :
Vous n'avez pas vraiment besoin d'utiliser la classe TagBuilder. Vous pouvez utiliser une classe StringBuilder à la place. Cependant, la classe TagBuilder vous facilite un peu la vie.
Examinez les méthodes de TagBuilder et demandez-vous si elles vous apportent quelque chose. Voudriez-vous faire la même chose vous-même, manuellement dans StringBuilder
à chaque fois ? Y a-t-il un échappement qu'il fait pour vous ? Fusion d'attributs, etc. Le code résultant est-il plus facile à lire, indiquant plus clairement que vous construisez une balise plutôt qu'une chaîne arbitraire ?
Il y a un point que les autres réponses ont manqué jusqu'à présent. Si vous retournez TagBuilder
à partir d'une méthode d'extension, vous pouvez continuer à ajouter des attributs dans votre vue. Imaginons que vous renvoyiez un tableau à partir d'une aide Html et que vous souhaitiez ajouter un attribut de classe. Si vous utilisez une méthode StringBuilder
vous devez passer la classe en tant que paramètre.
public static string Table(...., string @class)
{
...
sb.AppendFormat("class='{0}", @class);
...
}
// In the view
<%: Html.Table(someParams, "fancy") %>
Mais ajouter un attribut de classe à une balise HTML est pas la préoccupation d'une méthode d'extension qui crée une table ! Si nous passons à un modèle sémantique (TagBuilder) pour générer le HTML, nous pouvons ajouter l'attribut class en dehors de la méthode table.
public static TagBuilder Table(....)
{
...
return tag;
}
// In the view
<%: Html.Table(someParams).AddCssClass("fancy") %>
En plus de TagBuilder, vous pouvez consulter la bibliothèque HtmlTags de FubuMVC. C'est un bien meilleur modèle pour générer du HTML. J'ai quelques plus de détails sur le blog.
ne génèrent-ils pas la même chose ??
Bien sûr, mais ça ne devrait pas être dissuasif, n'est-ce pas ? Une classe est conçue pour quelque chose de plus spécifique que l'autre, elle offre donc un plus grand niveau de commodité.
Je pourrais demander : pourquoi utiliser un StringBuilder
? Pourquoi pas un List<char>
? Ne pourrais-je pas générer la même chose à partir de l'un ou l'autre ?
Pour aller plus loin : pourquoi même un List<char>
? Pourquoi ne pas simplement char[]
dont je peux contrôler la taille et la manipulation ? Je peux tout à fait créer un string
d'un char[]
.
En fait, tout ce dont j'ai besoin est un char*
et un int
(pour la longueur). C'est vrai ?
Ce que je veux dire, c'est que si une classe est disponible pour une fonctionnalité spécialisée que vous pouvez utiliser, il est logique de l'utiliser si vous voulez mon avis.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.