28 votes

TagBuilder imbriqué -as TagBuilderTree-

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 ?

47voto

SLaks Points 391154

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();
}

6voto

MattSlay Points 1392

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 :

  1. Générer manuellement le html en utilisant un StringBuilder
  2. Utilisation de plusieurs TagBuilders et imbrication du contenu

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.

-1voto

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.com

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.

Powered by:

X