Apa cara terbaik untuk membuat HTML dalam kode C #? [Tutup]

15

Saya memiliki keyakinan bahwa markup harus tetap dalam mark-up dan bukan pada kode di belakang.

Saya datang ke situasi di mana saya pikir itu dapat diterima untuk membangun HTML dalam kode di belakang. Saya ingin memiliki beberapa konsensus tentang apa praktik terbaik atau seharusnya.

Kapan bisa membangun html dalam kode di belakang? Apa metode terbaik untuk membuat html ini? (contoh: Strings, StringBuilder, HTMLWriter, dll)

Rodney
sumber
coba gunakan templat dan placeholder di mana Anda akan meludah mark-up html ini.
Yusubov
5
Pilihan lain: menghasilkan XML berdasarkan model data Anda dan kemudian menggunakan XSLT untuk mengubah XML menjadi HTML.
FrustratedWithFormsDesigner
Baru saja datang ke pemberitahuan saya hari ini C # / XAML untuk HTML5, terlihat menjanjikan dan mungkin sesuai dengan skenario Anda. cshtml5.com
softveda
masalah dengan rute XSLT adalah dalam pelokalan. Jika Anda membutuhkan dua bahasa, Anda membutuhkan dua lembar gaya XSLT dan membuatnya paralel. Itu neraka. Lebih baik menulis HTML ke file teks dari C #. gunakan String.Format dan $ ".. {variabel} ..." bersama dengan WPFLocalization?
Erik

Jawaban:

12

Apakah menggunakan sesuatu seperti Razor tidak berlaku di sini? Karena jika Anda melakukan banyak pembuatan html menggunakan mesin tampilan dapat membuatnya jauh lebih mudah. Itu juga dibangun untuk digunakan di luar ASP.NET.

Namun terkadang itu bukan yang Anda butuhkan. Sudahkah Anda mempertimbangkan untuk menggunakan kelas TagBuilder yang merupakan bagian dari .net (mvc)? Ada juga HtmlWriter di System.Web.UI (untuk formulir web). Saya akan merekomendasikan salah satunya jika Anda membuat Controlsatau Html Helpers.

Daniel Little
sumber
3
+1, jika Anda perlu membuat template di dalam pisau cukur aplikasi adalah cara yang tepat. Periksa razorengine @ nuget.org/packages/RazorEngine jika Anda membutuhkan opsi hebat untuk memasang silet dalam aplikasi non-asp.net.
Wyatt Barnett
1
Saya memiliki persyaratan serupa di mana saya perlu menghasilkan html (banyak) di perpustakaan kelas. Saya ingin menggunakan pisau cukur untuk ini, tetapi berjuang untuk memahami cara mempertahankan file cshtml di dll. Bagaimana itu bisa disatukan?
Yashvit
Anda bisa meneruskan string stackoverflow.com/questions/3628895/…
Daniel Little
14

Saya akan menggunakan Paket Agility Html untuk merakit HTML dan kemudian menulisnya ke file teks.

Banyak jam kerja digunakan untuk membuat Html Agility Pack kuat dan HTML-compliant HTML-ramah.

Saya pikir itu bahkan termasuk contoh aplikasi yang menghasilkan HTML.

Dari beranda:

Contoh aplikasi:

Memperbaiki halaman atau membuat generasi. Anda dapat memperbaiki halaman seperti yang Anda inginkan, memodifikasi DOM, menambahkan node, menyalin node, well ... apa saja.

Jim G.
sumber
5

Saya akan menggunakan htmltag untuk membuat HTML.

Contoh:

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

Dan kemudian CSQuery jika saya ingin mem-parsing HTML

Contoh:

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

Tentu saja ada perpustakaan di luar sana, seperti HTML Agility Pack yang dapat membantu Anda dalam upaya ini.

Jika Anda benar-benar tidak ingin menggunakan perpustakaan yang ada, dan ingin kode sederhana, turun-dan-kotor, saya suka ide untuk mengabstraksi beberapa perilaku seperti jawaban sebelumnya. Saya juga menyukai gagasan menggunakan StringBuilder yang mendasarinya, sebagai lawan dari string karena beberapa alasan:

  1. String kurang efisien daripada pembangun string
  2. StringBuilder adalah struktur data yang dapat diindeks,

Jika saya tidak membutuhkan mesin HTML yang direkayasa secara besar-besaran, saya akan membangun antarmuka yang sederhana dan intuitif

AddLineBreak();
AddSimpleTag(string tagName);
AddSimpleTagAt(string tagName, string content, int index);
Output();
Tim C
sumber
1
Struktur data yang dapat diindeks menarik, tetapi saya tidak akan terlalu khawatir tentang efisiensi: codinghorror.com/blog/2009/01/…
Jim G.
1
Saya telah mendapatkan beberapa kali pada berat String, terutama string BENAR-BENAR besar. StringBuilders lebih hemat memori dan efisien prosesor saat mereka besar. Jadi, dalam implementasi seperti ini, di mana HTML bisa menjadi sangat besar, saya akan memulai dengan StringBuilder. Jika ada jaminan bahwa HTML tidak akan menjadi sangat besar, sebuah string pasti akan memadai.
Tim C
1
Nah jika HTML bisa menjadi sangat besar, maka saya pasti akan merekomendasikan Paket HTML Agility. [Saya sebenarnya merekomendasikan HTML Agility Pack dua menit sebelum Anda melakukannya. :)]
Jim G.
1

Jika Anda akhirnya hanya menggunakan string, jangan lupa untuk melepaskan semua karakter yang disediakan HTML dalam data output Anda.

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

Saya sarankan menggunakan kelas HTML-aware atau perpustakaan daripada bekerja secara langsung dengan string. HTMLWriter terlihat seperti awal yang bagus.

Mike Clark
sumber
Terima kasih atas wawasan ini. Bagi siapa pun yang dapat membaca ini, inilah yang saya gunakan untuk meneruskan nilai-nilai dataat dalam templat item. Kuncinya adalah (seperti yang disarankan Mike Clark) untuk menjadi sadar HTML: <asp: Button ID = "btnEdit" CssClass = "btnmaatwerksmall" runat = "server" Teks = "Wijzig" OnClientClick = '<% # String.Format ("OpenChildInEnterprise (& apos; {0} & apos;, & apos; {1} & apos;, & apos; {2} & apos;); ", Eval (" Cursus "), Eval (" Omschrijving "), Eval (" Opmerking "))% > '/>
real_yggdrasil
-1

Hampir dua tahun setelah posting asli - ini adalah solusi yang telah bekerja dengan baik untuk saya. Dalam dokumen target saya menempatkan yang berikut ini:

<table>    
    <%:theHtmlTableMomToldYouAbout() %>    //# Where I want my rows of table data to go
</table>

fungsi yang dipanggil terlihat seperti ini:

    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;      
    }

Dan output yang dihasilkan di browser seperti yang diharapkan:
Jumlahnya adalah: 0
Jumlahnya adalah: 1
Jumlahnya: 2
Jumlahnya yang: 3
Jumlahnya yang: 4

Ketika saya pergi untuk melihat sumber saya menemukan yang berikut:

<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>
WebFixItMan
sumber
1
Saya akan menunjukkan bahwa solusi Anda memiliki banyak masalah yang sama dengan 'konten' menjadi string yang tidak dapat diubah seperti yang dijelaskan dalam posting dengan skor rendah untuk pertanyaan ini.
-1

MENYALA!

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;

Saya mungkin akan downvoted untuk ini, tetapi sebagai mantan desainer yang harus men-tweak HTML dalam kode sebelum saya benar-benar tahu banyak tentang. NET, kode di atas adalah cara yang lebih mudah untuk dipahami daripada metode yang abstrak pembuatan HTML. Jika Anda berpikir seorang desainer mungkin harus mengubah HTML Anda, gunakan string sederhana seperti ini.

Sesuatu yang saya lihat banyak devs lewatkan ketika mereka menulis HTML dalam kode adalah bahwa dalam HTML, tanda kutip tunggal atau ganda diperbolehkan untuk atribut. Jadi, alih-alih menghindari semua tanda kutip dalam kode (yang terlihat aneh sekali bagi yang tidak diinisiasi), gunakan saja tanda kutip tunggal untuk kutipan html di dalam string Anda.


BAIK. Semua pembenci string yang berangkai adalah perwakilan saya. Inilah cara yang 'tepat' untuk melakukan ini tanpa penggabungan string, tetapi saya berpendapat bahwa setiap halaman normal dengan tabel normal tidak akan menghadirkan masalah kinerja di luar skala konyol seperti 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();
Graham
sumber
3
-1 menggunakan + untuk merangkai string dalam loop adalah hal terburuk yang dapat Anda lakukan.
Daniel Little
lanjutan: lihat stackoverflow.com/questions/3102806/…
Daniel Little
Sebagai permulaan, menggunakan +=di dalam loop dengan cara ini tidak berskala sama sekali; karena string tidak dapat diubah, Anda membuat string baru setiap kali melakukannya. Gunakan StringBuildersaja.
Robert Harvey
3
Mengapa orang yang menulis kode mengerikan harus membagikan kode mengerikan mereka kepada orang lain.
Ramhound
3
@Ramhound Bagaimana dengan If you think a designer might ever have to tweak your HTML, use simple strings like this.yang sulit dimengerti? Beberapa orang mendefinisikan kode mengerikan adalah yang membeli kinerja milidetik dengan biaya beberapa detik untuk memahami sepenuhnya. Jelas ketika Anda mengantisipasi kode Anda dilihat atau dikelola oleh penyebut umum terendah individu, kasus ini dapat dipastikan bahwa menulis kode yang lebih mudah dipahami atau diubah selalu lebih baik daripada kode paling bersih atau berkinerja terbaik.
maple_shaft