タグ ビルダーと文字列ビルダーを使用して htmlhelper クラスでテーブルを作成する場合と、HtmlTable を使用する場合の違いは何ですか?
彼らは同じものを生成していませんか??
タグ ビルダーと文字列ビルダーを使用して htmlhelper クラスでテーブルを作成する場合と、HtmlTable を使用する場合の違いは何ですか?
彼らは同じものを生成していませんか??
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);
そのほうがいいんじゃない?
便利なだけです。このチュートリアルから:
TagBuilder クラスを実際に使用する必要はありません。代わりに StringBuilder クラスを使用できます。ただし、TagBuilder クラスを使用すると、作業が少し楽になります。
TagBuilder のメソッドを見て、それらが価値をもたらすかどうかを考えてください。StringBuilder
毎回手動で同じことをやりたいですか? それがあなたのために行うエスケープはありますか?属性のマージなど?結果のコードは読みやすく、任意の文字列ではなくタグを作成していることを明確にしていますか?
これまでのところ、他の回答が見逃している点があります。拡張メソッドから戻った場合TagBuilder
は、引き続きビューに属性を追加できます。Html ヘルパーからテーブルを返していて、クラス属性を追加したいとしましょう。を使用している場合はStringBuilder
、クラスをパラメーターとして渡す必要があります。
public static string Table(...., string @class)
{
...
sb.AppendFormat("class='{0}", @class);
...
}
// In the view
<%: Html.Table(someParams, "fancy") %>
しかし、class 属性を HTML タグに追加することは、テーブルを作成する拡張メソッドには関係ありません! HTML を生成するためのセマンティック モデル (TagBuilder) に切り替えると、table メソッドの外側に class 属性を追加できます。
public static TagBuilder Table(....)
{
...
return tag;
}
// In the view
<%: Html.Table(someParams).AddCssClass("fancy") %>
TagBuilder に加えて、FubuMVC の HtmlTags ライブラリもチェックしてみてください。これは、HTML を生成するためのはるかに優れたモデルです。ブログにもう少し詳しく書いています。
彼らは同じものを生成していませんか??
まあ、確かに、それは抑止力にはなりませんよね?1 つのクラスは、他のクラスよりも具体的な目的のために設計されているため、より高いレベルの利便性を提供します。
私は尋ねることができます:なぜ使用するのStringBuilder
ですか?なぜではないのList<char>
ですか?どちらからも同じものを生成できませんでしたか?
さらに一歩進んで、なぜList<char>
? char[]
サイズ変更/操作を自分で制御できるだけではないのはなぜですか? string
からを完全に作成できますchar[]
。
実際、必要なのは achar*
と an int
(長さ) だけです。右?
私が言いたいのは、クラスが使用できる特殊な機能に使用できる場合、私に尋ねられたらそれを使用するのが理にかなっているということです。
他の投稿で言及されているように、TagBuilder はいくつかの便利さをもたらします。ただし、TagBuilder と StringBuilder が同じ結果を生成しない可能性があることを考慮する必要があります。TagBuilder は html エンコーディングを適用しますが、StringBuilder は適用しません。したがって、TagBuilder を使用して、XSS 攻撃によって悪用される可能性のある脆弱性を克服する方が安全です。
StringBuilderを使用している場合は、値のHTMLエンコードを行うことを忘れないでください。TagBuilderがこれを自動的に行うことを願っています。