TagBuilder est une belle implémentation pour construire des éléments HTML. B
Question : Dois-je implémenter quelques classes (TagBuilderTree, et TagBuilderNode) qui supportent les balises imbriquées ou ai-je manqué quelque chose ?
TagBuilder est une belle implémentation pour construire des éléments HTML. B
Question : Dois-je implémenter quelques classes (TagBuilderTree, et TagBuilderNode) qui supportent les balises imbriquées ou ai-je manqué quelque chose ?
Vous pouvez construire les éléments enfants dans des TagBuilders séparés et placer leur HTML généré dans le TagBuilder parent.
Voici un exemple : A <select>
avec quelques <option>
s (exemple dégraissé pour plus de fermeté)
TagBuilder select = new TagBuilder("select");
foreach (var language in languages) // never ye mind about languages
{
TagBuilder option = new TagBuilder("option");
option.MergeAttribute("value", language.ID.ToString());
if (language.IsCurrent)
{
option.MergeAttribute("selected", "selected");
}
option.InnerHtml = language.Description;
// And now, the money-code:
select.InnerHtml += option.ToString();
}
OK, j'ai décidé de faire un petit test dans ma propre base de code.
J'ai comparé ces deux méthodes pour créer exactement le même HTML final :
Générer manuellement le html en utilisant un StringBuilder :
var sb = new StringBuilder();
sb.AppendLine("<div class='control-group'>");
sb.AppendFormat(" <label class='control-label' for='{0}_{1}'>{2}</label>", propObj.ModelType, propObj.ModelProperty, propObj.LabelCaption);
sb.AppendLine(" <div class='controls'>");
sb.AppendFormat(" <input id='{0}_{1}' name='{0}[{1}]' value='{2}' />", propObj.ModelType, propObj.ModelProperty, propObj.PropertyValue);
sb.AppendLine(" </div>");
sb.AppendLine("</div>");
return new HtmlString(sb.ToString());
Utilisation de plusieurs TagBuilders et fusion du contenu :
TagBuilder controlGroup = new TagBuilder("div");
controlGroup.AddCssClass("control-group");
TagBuilder label = new TagBuilder("label");
label.AddCssClass("control-label");
label.InnerHtml = propObj.LabelCaption;
TagBuilder controls = new TagBuilder("div");
TagBuilder input = new TagBuilder("input");
input.Attributes["id"] = propObj.ModelType + "_" + propObj.ModelProperty;
input.Attributes["name"] = propObj.ModelType + "[" + propObj.ModelProperty + "]";
input.Attributes["value"] = propObj.PropertyValue;
controls.InnerHtml += input;
controlGroup.InnerHtml += label;
controlGroup.InnerHtml += controls;
return new HtmlString(controlGroup.ToString());
Pour moi, le numéro 1 est plus facile à lire et beaucoup plus concis, mais je peux aussi apprécier la structure du numéro 2.
Le problème que je rencontre avec TagBuilder pour créer des balises est qu'il semble très difficile à maintenir. D'un autre côté, l'AppendFormat de StringBuilder rend le code non seulement maintenable, mais fonctionne aussi avec une bonne efficacité.
J'ai légèrement amélioré la méthode n°1 de MattSlay. Je n'ai utilisé qu'un seul appel à la méthode AppendFormat de StringBuilder et j'ai utilisé la chaîne littérale C# pour définir le format. Le résultat est que le format ressemble exactement au résultat souhaité et fonctionne efficacement.
var sb = new StringBuilder();
sb.AppendFormat(
@"<div class='control-group'>
<label class='control-label' for='{0}_{1}'>{2}</label>
<div class='controls'>
<input id='{0}_{1}' name='{0}[{1}]' value='{3}' />
</div>
</div>",
propObj.ModelType,
propObj.ModelProperty,
propObj.LabelCaption,
propObj.PropertyValue);
return new HtmlString(sb.ToString());
J'espère que cela vous aidera !
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.