28

TagBuilder は、HTML 要素を構築するための優れた実装です。しかし、いくつかの HTML 要素は別の要素を持つことができます (私は like children と呼びました)。Mvc クラスからクラスが見つかりませんでした。

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

4

3 に答える 3

47

子要素を個別の 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();
}
于 2011-02-10T15:01:25.487 に答える
6

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 の構造も評価できます。

于 2012-12-12T21:29:44.160 に答える
-1

タグを作成するために私が TagBuilder で抱えている問題は、非常にメンテナンスが難しいように見えることです。一方、StringBuilder の AppendFormat は、コードを保守しやすくするだけでなく、効率的に実行することもできます。

MattSlay の #1 メソッドを少し改善しました。StringBuilder の AppendFormat メソッドの呼び出しを 1 回だけ使用し、C# 文字列リテラルを使用して形式を定義しました。その結果、フォーマットは目的の結果とまったく同じように見え、効率的に実行されます。

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

お役に立てれば!

于 2013-08-13T12:43:36.540 に答える