web-dev-qa-db-ja.com

StringBuilderではなくTagBuilderを使用する理由

タグビルダーと文字列ビルダーを使用してhtmlhelperクラスにテーブルを作成する場合、またはHtmlTableを使用する場合の違いは何ですか?

彼らは同じものを生成していませんか?

40
DaveDev

TagBuilderは、htmlタグとそのコンテンツを作成するために特別に設計されたクラスです。結果はとにかく文字列であり、もちろんStringBuilderを引き続き使用でき、結果は同じになると言って間違いありませんが、TagBuilderを使用すると簡単に処理できます。タグを生成する必要があるとしましょう:

<a href='http://www.stackoverflow.com' class='coolLink'/>

StringBuilderを使用するには、次のように記述する必要があります。

var sb = new StringBuilder();
sb.Append("<a href='");
sb.Append(link);
sb.Append("' class = '");
sb.Append(ccsClass);
sb.Append("'/>");
sb.ToString();

かっこよくありませんね。そして、TagBuilderを使用してそれを構築する方法を比較します。

var tb = new TagBuilder("a");
tb.MergeAttribute("href",link);
tb.AddCssClass(cssClass);
tb.ToString(TagRenderMode.SelfClosing);

それは良くないですか?

64

それは便利です。 このチュートリアル から:

TagBuilderクラスを実際に使用する必要はありません。代わりに、StringBuilderクラスを使用できます。ただし、TagBuilderクラスを使用すると、作業が少し簡単になります。

TagBuilderのメソッドを見て、それらがあなたに価値を与えるかどうかを考えてください。 StringBuilderで毎回手動で同じことをしたいですか?逃げることはありますか?属性のマージなど?結果のコードは読みやすく、任意の文字列ではなくタグを作成していることが明確になりますか?

16
Jon Skeet

他の回答がこれまでに見逃していた点があります。拡張メソッドからTagBuilderを返す場合は、ビューに属性を追加し続けることができます。 Htmlヘルパーからテーブルを返していて、クラス属性を追加したいとします。 StringBuilderを使用している場合は、クラスをパラメーターとして渡す必要があります。

public static string Table(...., string @class)
{
    ...
    sb.AppendFormat("class='{0}", @class);
    ...
}

// In the view
<%: Html.Table(someParams, "fancy") %>

ただし、HTMLタグにクラス属性を追加することはテーブルを作成する拡張メソッドの問題ではありません! HTMLを生成するためにセマンティックモデル(TagBuilder)に切り替えると、テーブルメソッドの外部にクラス属性を追加できます。

public static TagBuilder Table(....)
{
    ...
    return tag;
}

// In the view
<%: Html.Table(someParams).AddCssClass("fancy") %>

TagBuilderに加えて、FubuMVCのHtmlTagsライブラリをチェックアウトすることもできます。これは、HTMLを生成するためのはるかに優れたモデルです。ブログにいくつかの 詳細 があります。

13
Ryan

彼らは同じものを生成していませんか?

まあ、確かに、しかしそれは抑止力であってはなりません、そうでしょうか? 1つのクラスは、他のクラスよりも具体的なもののために設計されているため、より高いレベルの利便性を提供します。

私は尋ねることができます:なぜStringBuilderを使うのですか?なぜList<char>ではないのですか?どちらからも同じことを生成できませんか?

さらに一歩進んで:なぜList<char>なのか? char[]だけでなく、サイズ変更/操作を自分で制御できるのはなぜですか。 char[]からstringを完全に作成できます。

実際、本当に必要なのはchar*int(長さ)だけです。正しい?

私の要点は、クラスが使用できる特殊な機能に使用できる場合、私に尋ねればそれを使用することが理にかなっているということです。

8
Dan Tao

他の投稿で言及されているように、TagBuilderはいくつかの便利さをもたらします。ただし、TagBuilderとStringBuilderは同じ結果を生成しない可能性があることを考慮する必要があります。 TagBuilderはHTMLエンコーディングを適用しますが、StringBuilderは適用しません。そのため、TagBuilderを使用して、XSS攻撃を介して悪用される可能性のある脆弱性を克服する方が安全です。

1
Farshid Saberi

StringBuilderを使用している場合は、値のHTMLエンコードを行うことを忘れないでください。 TagBuilderがこれを自動的に行うことを願っています。

0
STO