web-dev-qa-db-ja.com

ネストされたTagBuilder-TagBuilderTreeとして-

TagBuilderは、HTML要素をビルドするための優れた実装です。しかし、-some- HTML要素は別の要素を持つことができます(私は子供のように呼びました)。 Mvcクラスからクラスが見つかりませんでした。

質問;ネストされたタグをサポートするいくつかのクラス(TagBuilderTreeおよびTagBuilderNode)を実装する必要がありますか、それとも何かを見逃しましたか?

26
Nuri YILMAZ

子要素を個別のTagBuilderで構築し、生成されたHTMLを親TagBuilderに配置できます。

次に例を示します。A<select> 一部で <option>s(簡潔さのために脱脂された例)

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

OK、私は自分のコードベースで少しテストをすることにしました。

これら2つの方法を比較して、まったく同じ最終的なHTMLを作成しました。

  1. StringBuilderを使用してHTMLを手動で生成する
  2. 複数のTagBuilderを使用し、コンテンツをネストする

StringBuilderを使用してHTMLを手動で生成します。


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

複数のTagBuilderを使用し、コンテンツをマージします。


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

私にとって、#1は読みやすく、はるかに簡潔ですが、#2の構造も理解できます。

5
MattSlay