私は、マークアップは、コードビハインドではなく、マークアップのままにしておくべきだと考えています。
コードビハインドでHTMLを構築することは許容できると思う状況になりました。ベストプラクティスが何であるか、または何をすべきかについて、コンセンサスを持ちたいと思います。
コードビハインドでhtmlをビルドすることが受け入れられるのはいつですか?このhtmlを作成する最良の方法は何ですか?(例:文字列、StringBuilder、HTMLWriterなど)
私は、マークアップは、コードビハインドではなく、マークアップのままにしておくべきだと考えています。
コードビハインドでHTMLを構築することは許容できると思う状況になりました。ベストプラクティスが何であるか、または何をすべきかについて、コンセンサスを持ちたいと思います。
コードビハインドでhtmlをビルドすることが受け入れられるのはいつですか?このhtmlを作成する最良の方法は何ですか?(例:文字列、StringBuilder、HTMLWriterなど)
回答:
Razorのようなものはここでは使用できませんか?ビューエンジンを使用して多くのhtmlを生成している場合、それがはるかに簡単になるからです。また、ASP.NETの外部で使用するために構築されました。
ただし、必要なものではない場合もあります。.net(mvc)の一部であるTagBuilderクラスの使用を検討しましたか?System.Web.UI(Webフォーム用)にはHtmlWriterもあります。あなたが作っているControls
か、またはHtml Helpers
。
Html Agility Packを使用しますを HTMLを作成し、テキストファイルに書き出します。
Html Agility Packを堅牢でHTML準拠にするために多くの工数が費やされました HTMLフレンドリーに。
HTMLを生成するサンプルアプリケーションも含まれていると思います。
ホームページから:
サンプルアプリケーション:
ページの固定または生成。ページを好きなように修正したり、DOMを変更したり、ノードを追加したり、ノードをコピーしたりできます。
もちろん、これらの作業を支援するHTML Agility Packなどのライブラリがあります。
既存のライブラリを本当に使用したくなく、単純で下品なコードが必要な場合は、前述の回答のような動作の一部を抽象化するというアイデアが好きです。また、いくつかの理由で文字列ではなく、基になるStringBuilderを使用するというアイデアも気に入っています。
大規模に設計されたHTMLエンジンが必要ない場合は、シンプルで直感的なインターフェイスを構築します
AddLineBreak();
AddSimpleTag(string tagName);
AddSimpleTagAt(string tagName, string content, int index);
Output();
文字列だけを使用することになった場合、出力データ内のすべてのHTML予約文字をエスケープすることを忘れないでください。
& &
> >
< <
" "
' '
ただし、文字列を直接操作する代わりに、HTML対応のクラスまたはライブラリを使用することをお勧めします。HTMLWriterはかなり良いスタートのようです。
最初の投稿からほぼ2年後-これは私にとってうまくいった解決策です。ターゲット文書に次を配置します。
<table>
<%:theHtmlTableMomToldYouAbout() %> //# Where I want my rows of table data to go
</table>
呼び出される関数は次のようになります。
public HtmlString theHtmlTableMomToldYouAbout()
{
string content = "";
HtmlString theEnvelopePlease = null;
for (int i = 0; i < 5; i++)
{
content = content + "<tr><td>The Number Is: " + i + "</td></tr>";
}
theEnvelopePlease = new HtmlString(content);
return theEnvelopePlease;
}
ブラウザーでの結果の出力は期待どおりです
。数値:0
数値:1
数値:2
数値:3
数値:4
ソースを表示すると、次のことがわかります。
<table>
<tr><td>The Number Is: 0</td></tr>
<tr><td>The Number Is: 1</td></tr>
<tr><td>The Number Is: 2</td></tr>
<tr><td>The Number Is: 3</td></tr>
<tr><td>The Number Is: 4</td></tr>
</table>
フレームオン!
var html = "";
html += "<table class='colorful'>";
foreach(var item in collection) {
html += "<tr>";
html += "<td class='boldCell'>" + item.PropWhatever + "</td>";
// more cells here as needed
html += "</tr>";
}
html += "</table>";
placeholder1.InnerHtml = html;
私はこれに落胆するでしょうが、.NETについてよく知る前にコードでHTMLを微調整する必要があった元デザイナーとして、上記のコードはHTML作成を抽象化するメソッドよりも簡単に理解できました。デザイナーがHTMLを微調整する必要があると思われる場合は、このような単純な文字列を使用してください。
多くの開発者がコードでHTMLを書くときに見落としているのは、HTMLでは属性に一重引用符または二重引用符が許可されていることです。そのため、コード内のすべての引用符をエスケープするのではなく(開始していない人には見た目が悪い)、文字列内のhtml引用符には単一引用符を使用します。
ファイン。憎しみを連結するすべての文字列は、私の担当者を怒らせています。文字列を連結せずにこれを行うための「適切な」方法がありますが、通常のテーブルのある通常のページでは、Googleのようなばかげたスケール以外のパフォーマンスの問題は発生しません。
var sb = new System.Text.StringBuilder();
sb.Append("<table class='colorful'>");
foreach (var item in collection)
{
sb.Append("<tr>");
sb.Append("<td class='boldCell'>" + item.PropWhatever + "</td>");
// more cells here as needed
sb.Append("</tr>");
}
sb.Append("</table>");
placeholder1.InnerHtml = sb.ToString();
+=
まず、最初に、この方法でループ内で使用しても、まったくスケーリングしません。文字列は不変であるため、実行するたびに新しい文字列を作成しています。StringBuilder
代わりに使用してください。
If you think a designer might ever have to tweak your HTML, use simple strings like this.
わかりにくいのはどうですか?恐ろしいコードの一部の人々の定義は、完全に理解するのに何秒もかかるという犠牲を払ってミリ秒のパフォーマンスを買うものです。明らかに、個人の最小公分母によってコードが表示または保守されると予想される場合、最も確実に、最もわかりやすいまたは最適なコードよりも、理解しやすい、または微調整しやすいコードを作成する方が良いというケースを作成できます。