TagBuilder は、HTML 要素を構築するための優れた実装です。しかし、いくつかの HTML 要素は別の要素を持つことができます (私は like children と呼びました)。Mvc クラスからクラスが見つかりませんでした。
質問; ネストされたタグをサポートするいくつかのクラス (TagBuilderTree および TagBuilderNode) を実装する必要がありますか?
TagBuilder は、HTML 要素を構築するための優れた実装です。しかし、いくつかの HTML 要素は別の要素を持つことができます (私は like children と呼びました)。Mvc クラスからクラスが見つかりませんでした。
質問; ネストされたタグをサポートするいくつかのクラス (TagBuilderTree および TagBuilderNode) を実装する必要がありますか?
子要素を個別の 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();
}
OK、私は自分のコード ベースで少しテストを行うことにしました。
これら 2 つの方法を比較して、まったく同じ最終的な HTML を作成しました。
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 の構造も評価できます。
タグを作成するために私が 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());
お役に立てれば!