C#コードでHTMLを作成する最良の方法は何ですか?[閉まっている]


15

私は、マークアップは、コードビハインドではなく、マークアップのままにしておくべきだと考えています。

コードビハインドでHTMLを構築することは許容できると思う状況になりました。ベストプラクティスが何であるか、または何をすべきかについて、コンセンサスを持ちたいと思います。

コードビハインドでhtmlをビルドすることが受け入れられるのはいつですか?このhtmlを作成する最良の方法は何ですか?(例:文字列、StringBuilder、HTMLWriterなど)


このhtmlマークアップを吐き出すテンプレートとプレースホルダーを使用してみてください。
ユスボフ

5
別のオプション:データモデルに基づいてXMLを生成し、XSLTを使用してXMLをHTMLに変換します。
FrustratedWithFormsDesigner

今日、HTML5用のC#/ XAMLに気付いたのですが、有望そうで、あなたのシナリオに合うかもしれません。cshtml5.com
softveda

XSLTルートの問題はローカライズにあります。2つの言語が必要な場合は、2つのXSLTスタイルシートが必要であり、それらを平行に保ちます。それは地獄だ。HTMLをC#からテキストファイルに書き込む方が良いでしょう。String.Formatと$ ".. {variable} ..."をWPFLocalizationと一緒に使用しますか?
エリック

回答:


12

Razorのようなものはここでは使用できませんか?ビューエンジンを使用して多くのhtmlを生成している場合、それがはるかに簡単になるからです。また、ASP.NETの外部で使用するために構築されました。

ただし、必要なものではない場合もあります。.net(mvc)の一部であるTagBuilderクラスの使用を検討しましたか?System.Web.UI(Webフォーム用)にはHtmlWriterもあります。あなたが作っているControlsか、またはHtml Helpers


3
+1、アプリ内でテンプレートを作成する必要がある場合は、かみそりが最適です。asp.net以外のアプリ内でrazorをマウントするための優れたオプションが必要な場合は、razorengine @ nuget.org/packages/RazorEngineをご覧ください。
ワイアットバーネット

1
クラスライブラリでhtml(それのロード)を生成する必要がある場合、同様の要件があります。私はこれのためにカミソリを使いたいが、dllのcshtmlファイルを維持する方法を理解するのに苦労しています。どうやって一緒にバンドルできますか?
ヤシュビット

あなたは、任意の文字列を渡すことができますstackoverflow.com/questions/3628895/...
ダニエルリトル

14

Html Agility Packを使用しますを HTMLを作成し、テキストファイルに書き出します。

Html Agility Packを堅牢でHTML準拠にするために多くの工数が費やされました HTMLフレンドリーに。

HTMLを生成するサンプルアプリケーションも含まれていると思います。

ホームページから:

サンプルアプリケーション:

ページの固定または生成。ページを好きなように修正したり、DOMを変更したり、ノードを追加したり、ノードをコピーしたりできます。


5

私はhtmltagsを使用しますHTMLを作成するを使用します。

例:

var tag = new HtmlTag("span")
    .Text("Hello & Goodbye")
    .AddClass("important")
    .Attr("title", "Greetings")

HTMLを解析する場合は、CSQuery

例:

dom.Select("div > span")
    .Eq(1)
    .Text("Change the text content of the 2nd span child of each div");

2

もちろん、これらの作業を支援するHTML Agility Packなどのライブラリがあります。

既存のライブラリを本当に使用したくなく、単純で下品なコードが必要な場合は、前述の回答のような動作の一部を抽象化するというアイデアが好きです。また、いくつかの理由で文字列ではなく、基になるStringBuilderを使用するというアイデアも気に入っています。

  1. 文字列は文字列ビルダーよりも効率が悪い
  2. StringBuilderはインデックス可能なデータ構造です。

大規模に設計されたHTMLエンジンが必要ない場合は、シンプルで直感的なインターフェイスを構築します

AddLineBreak();
AddSimpleTag(string tagName);
AddSimpleTagAt(string tagName, string content, int index);
Output();

1
インデックス可能なデータ構造は説得力があるが、私は心配しないだろう、あまりにも効率について多く:codinghorror.com/blog/2009/01/...
ジム・G.

1
ストリングスの重さ、特に本当に大きなストリングスについて、私は何度か話を聞きました。StringBuilderは、サイズが大きくなると、メモリとプロセッサの効率が向上します。したがって、このような実装では、HTMLが非常に大きくなる可能性があるため、StringBuilderから始めます。HTMLが非常に大きくならないという保証がある場合は、文字列で十分です。
ティムC

1
HTMLが非常に大きくなれば、HTML Agility Packをお勧めします。[実際に2分前にHTML Agility Packをお勧めしました。:)]
ジムG.

1

文字列だけを使用することになった場合、出力データ内のすべてのHTML予約文字をエスケープすることを忘れないでください。

&    &
>    >
<    &lt;
"    &quot;
'    &apos;

ただし、文字列を直接操作する代わりに、HTML対応のクラスまたはライブラリを使用することをお勧めします。HTMLWriterはかなり良いスタートのようです。


この洞察力をありがとう。これを読む人は誰でも、これはアイテムテンプレートでデータテーブルの値を渡すために使用します。キーは(Mike Clarkが示唆しているように)HTML対応にすることです:<asp:Button ID = "btnEdit" CssClass = "btnmaatwerksmall" runat = "server" Text = "Wijzig" OnClientClick = '<%#String.Format( "OpenChildInEnterprise (&apos; {0}&apos;、&apos; {1}&apos;、&apos; {2}&apos;); "、Eval(" Cursus ")、Eval(" Omschrijving ")、Eval(" Opmerking "))% > '/>
real_yggdrasil 14

-1

最初の投稿からほぼ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>

1
あなたのソリューションには、この質問に対する低スコアの投稿で説明されているものと同じ「コンテンツ」が不変の文字列であるという問題が多くあることを指摘します。

-1

フレームオン!

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();

3
-1ループ内で文字列を連結するために+を使用することは、あなたができる最悪のことです。
ダニエルリトル


+=まず、最初に、この方法でループ内で使用しても、まったくスケーリングしません。文字列は不変であるため、実行するたびに新しい文字列を作成しています。StringBuilder代わりに使用してください。
ロバートハーベイ

3
恐ろしいコードを書く人々が、恐ろしいコードを他の人々と共有しなければならないのはなぜですか。
ラムハウンド

3
@Ramhound If you think a designer might ever have to tweak your HTML, use simple strings like this.わかりにくいのはどうですか?恐ろしいコードの一部の人々の定義は、完全に理解するのに何秒もかかるという犠牲を払ってミリ秒のパフォーマンスを買うものです。明らかに、個人の最小公分母によってコードが表示または保守されると予想される場合、最も確実に、最もわかりやすいまたは最適なコードよりも、理解しやすい、または微調整しやすいコードを作成する方が良いというケースを作成できます。
maple_shaft
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.