15

代替デバイスのアダプティブ レンダリングのメリット以外に、次のコードをすべて記述する意味はありますか。

writer.WriteBeginTag("table");
writer.WriteBeginTag("tr");
writer.WriteBeginTag("td");
writer.Write(HtmlTextWriter.TagRightChar);
writer.WriteEncodedText(someTextVariable);
writer.WriteEndTag("td");
writer.WriteEndTag("tr");
writer.WriteEndTag("table");

StringBuilder がこれだけで同じものを構築できる場合:

sb.Append("<table><tr><td>");
sb.Append(someTextVariable);
sb.Append("</td></tr></table>");
4

5 に答える 5

12

もう 1 つの利点は、HtmlTextWriter を使用すると、コードをよりクリーンな (より保守しやすい) 方法でフォーマットできることと、HtmlTextWriter が HTML のエンコードを自動的にサポートすることです。比較:

writer.AddAttribute(HtmlTextWriterAttribute.Id, "someId");
if (!string.IsNullOrEmpty(cssClass)) writer.AddAttribute(HtmlTextWriterAttribute.Class, cssClass);
writer.AddStyleAttribute(HtmlTextWriterStyle.Color, "Red");
writer.RenderBeginTag(HtmlTextWriterTag.Span);
writer.WriteEncodedText(text);
writer.RenderEndTag();

対:

StringBuilder html = new StringBuilder();
html.Append("<span");
html.Append(" id=\"someId\"");
if (!string.IsNullOrEmpty(cssClass)) html.AppendFormat(" class=\"{0}\"", HttpUtility.HtmlAttributeEncode(cssClass));
html.Append(">");
html.Append(HttpUtility.HtmlEncode(text));
html.Append("</span>");

2 番目の例のコードは、別の、おそらくよりクリーンな方法で記述できると主張する人もいるかもしれませんが、これは基本的に 1 つの標準的な書式設定方法を強制するため (これによりメンテナンスが改善されます)、HtmlTextWriter の利点と見なすことができます。

編集:実際、2 番目のスニペットで間違いを犯したため、戻って応答を修正する必要がありました。これは、私が言いたかった点を確認します。

于 2009-04-07T06:36:41.133 に答える
11

HtmlTextWriterを使用する理由は2つ考えられます。

  1. ライターを使用してインデントを追跡できるため、出力されたHTMLは、1行に表示されるのではなく、適切にフォーマットされます。

  2. HtmlTextWriterは通常、出力ストリームに関連付けられているため、メモリに長い文字列を作成するよりも効率的です(生成するHTMLの量によって異なります)。

これらはどちらも特別な理由ではありませんが、効率が必要な場合、または再利用され、可能な限りプロフェッショナルである必要があるベースコントロールを作成している場合は、ライターを使用するように私を説得するのに十分です。あなたのマイレージは異なる場合があります :-)。

于 2009-02-21T21:03:24.333 に答える
6

HtmlTextWriter は次の理由で有益です。

HtmlTextWriter は最もクリーンで、レンダリング時にマークアップが適切にインデントされます。

HtmlTextWriter が出力ストリームに直接書き込むため、パフォーマンスに影響があります。ToString が呼び出されるまで、Stringbuilder は出力ストリームに書き込みません。

ここにも、 HTML 出力の保存と再利用に HtmlTextWriter を使用する理由の例があります。

于 2009-02-21T21:14:47.097 に答える
2

ある時点で、クライアントにレンダリングするために、これをHtmlTextWriterに渡す必要があります。私はあなたが最終的なwriter.Write(sb.ToString());を持っていると思います。2番目の例ではそこにあります。コードの行を減らすためにできることは、2番目のStringBuilderの例とまったく同じ方法で生のHTMLを記述することですが、代わりにHtmlTextWriter.Writeを使用します。

writer.Write("<table><tr><td>");
writer.Write(someTextVariable);
writer.Write("</td></tr></table>");

その場合、StringBuilderを使用する必要はないようです。また、HtmlTextWriterは、少なくともある程度、生成されたHTMLが準拠していることを確認します(ただし、上記の場合、生のHTMLを作成する場合はそうではありません)。

于 2009-02-21T21:02:55.643 に答える
1

私が考えることができる最大の理由は、入力をサニタイズするために余分な手順を実行する必要がないようにすることです。ドキュメントによると、WriteEncodedText山括弧を適切に自動的にフォーマットします。

XSSは現実のものであり、将来の開発者がコードを保守しやすくするためにできることはすべて有益です。

于 2019-03-05T13:59:19.447 に答える