Tampilkan string sebagai html dalam tampilan mvc asp.net

98

Saya memiliki pengontrol yang menghasilkan string yang berisi markup html. Sekarang ketika saya menampilkannya pada tampilan, itu ditampilkan sebagai string sederhana yang berisi semua tag. Saya mencoba menggunakan helper Html untuk menyandikan / mendekode untuk menampilkannya dengan benar, tetapi tidak berhasil.

string str= "<a href="/Home/Profile/seeker">seeker</a> has applied to <a href="/Jobs/Details/9">Job</a> floated by you.</br>";

Menurut pandangan saya,

@Html.Encode(str)
Mukesh Sharma
sumber
6
Saya kira Html.Rawharus membantu.
Saeed Neamati
Juga saya pikir Anda dapat menggunakan HtmlStrinkelas, seperti dalamHtmlString str = new HtmlString("<span>Some HTML here</span>");
Saeed Neamati

Jawaban:

169

Anda dekat yang ingin Anda gunakan @Html.Raw(str)

@Html.Encodemengambil string dan memastikan bahwa semua karakter khusus ditangani dengan benar. Ini termasuk karakter seperti spasi.

Jared
sumber
6
@ Html.Raw persis seperti yang saya cari, terima kasih atas jawabannya :)
AFract
IHtmlString seperti yang disebutkan oleh @Jerad Rose jauh lebih baik
Pratyush Dhanuka
37

Anda seharusnya menggunakan IHtmlString:

IHtmlString str = new HtmlString("<a href="/Home/Profile/seeker">seeker</a> has applied to <a href="/Jobs/Details/9">Job</a> floated by you.</br>");

Setiap kali Anda memiliki properti model atau variabel yang perlu menampung HTML, saya rasa ini umumnya merupakan praktik yang lebih baik. Pertama-tama, ini sedikit lebih bersih. Sebagai contoh:

@Html.Raw(str)

Dibandingkan dengan:

@str

Selain itu, menurut saya ini sedikit lebih aman vs. menggunakan @Html.Raw(), karena kekhawatiran apakah data Anda adalah HTML disimpan di pengontrol. Dalam lingkungan di mana Anda memiliki pengembang front-end vs. back-end, pengembang back-end Anda mungkin lebih selaras dengan data apa yang dapat menyimpan nilai HTML, sehingga menjaga masalah ini di back-end (pengontrol).

Saya biasanya mencoba untuk menghindari penggunaan Html.Raw()bila memungkinkan.

Satu hal lain yang perlu diperhatikan, adalah saya tidak yakin di mana Anda menugaskan str, tetapi beberapa hal yang menjadi perhatian saya tentang bagaimana Anda dapat menerapkan ini.

Pertama, ini harus dilakukan di pengontrol, terlepas dari solusi ( IHtmlStringatau Html.Raw) Anda. Anda harus menghindari logika seperti ini dalam pandangan Anda, karena itu sebenarnya bukan miliknya.

Selain itu, Anda harus menggunakan Anda ViewModeluntuk mendapatkan nilai ke tampilan Anda (dan sekali lagi, idealnya menggunakan IHtmlStringsebagai tipe properti). Melihat sesuatu seperti @Html.Encode(str)itu agak mengkhawatirkan, kecuali Anda melakukan ini hanya untuk menyederhanakan contoh Anda.

Jerad Rose
sumber
1
Saya ingin menunjukkan bahwa pengontrol untuk perutean, dan bukan penyimpanan data. Selain itu, pengembang back-end Anda harus tahu lebih baik daripada pernah mengubah kontrak kode yang ada. UI harus terikat ke model, dan jika model berubah secara drastis, pengujian unit Anda akan berhenti.
Anthony Mason
Terima kasih atas jawaban anda. Saya suka itu.
Thomas.Benz
Ya, jawaban ini jauh lebih baik, saya awalnya menggunakan Html.Raw, tetapi ketika saya membaca jawaban ini, saya langsung beralih
Pratyush Dhanuka
7

kamu bisa memakai @Html.Raw(str)

Lihat MSDN untuk lebih lanjut

Mengembalikan markup yang tidak dikodekan HTML.

Metode ini membungkus markup HTML menggunakan kelas IHtmlString, yang merender HTML yang tidak dikodekan.

AthibaN
sumber
1

Saya memiliki masalah serupa dengan bidang input HTML di MVC. Halaman web hanya menampilkan kata kunci pertama dari bidang tersebut. Contoh: kolom masukan: "The quick brown fox" Nilai yang ditampilkan: "The"

Solusinya adalah menempatkan variabel dalam tanda kutip dalam pernyataan nilai sebagai berikut:

<input class="ParmInput" type="text" id="respondingRangerUnit" name="respondingRangerUnit"
       onchange="validateInteger(this.value)" value="@ViewBag.respondingRangerUnit">
Roland Wales
sumber
0

Saya mengalami masalah yang sama baru-baru ini, dan Google membawa saya ke sini, jadi saya taruh jawaban ini di sini seandainya orang lain juga mendarat di sini, untuk kelengkapan.

Saya perhatikan bahwa ketika saya memiliki format html yang buruk , saya sebenarnya telah menghapus semua tag html saya , dengan hanya konten non-tag yang tersisa . Saya terutama memiliki tabel dengan tag tabel pembuka yang hilang, dan kemudian semua tag html saya dari seluruh string di mana robek sepenuhnya.

Jadi, jika cara di atas tidak berhasil, dan Anda masih menggaruk-garuk kepala, periksa juga html Anda apakah valid.

Saya perhatikan bahkan setelah saya membuatnya berfungsi, MVC menambahkan tag tbody di mana saya tidak memilikinya. Ini memberi tahu saya bahwa ada pembersihan yang terjadi (MVC 5), dan bahwa jika tidak dapat terjadi, semua / beberapa tag akan dihapus.

Greg
sumber