Menulis / mengeluarkan string HTML tidak terhapus


436

Saya punya HTML aman / bersih yang disimpan dalam tabel DB.

Bagaimana saya bisa membuat konten HTML ini ditulis dalam tampilan Razor?

Itu selalu lolos dari karakter seperti <dan ampersand ke &amp;.


76
Untuk menyelamatkan orang-orang dari sejarah panjang diskusi di bawah ini -@Html.Raw()
— Chris S

Untuk menyelamatkan orang-orang seperti saya yang mencoba melakukan ini dengan jenis anonim dalam tampilan yang diketik secara dinamis, di mana ini tidak akan berhasil - lihat jawaban ini untuk pertanyaan saya yang lebih spesifik. Meskipun menggunakan pendekatan ini dengan tampilan yang sangat diketik masih lebih baik jika situasi Anda memungkinkan.
— brichins

Jawaban:


653

Andaikata konten Anda ada di dalam sebuah string bernama mystring...

Kamu bisa menggunakan:

@Html.Raw(mystring)

Atau Anda dapat mengkonversi string Anda ke HtmlStringatau jenis lain yang mengimplementasikan IHtmlStringdalam model atau langsung inline dan gunakan biasa @:

@{ var myHtmlString = new HtmlString(mystring);}
@myHtmlString

Terima kasih atas jawaban ini. Membantu saya menyelesaikan tugas kecil yang saya pelajari. :) Namun saya menggunakan versi terbaru MVC3 dan sejauh ini tidak ada Html.Raw :(

1
Hai Sergio. Saya menggunakan MVC 3 dan saya menggunakan metode Raw dengan benar.
— Gui

1
Terima kasih atas jawabannya! Saya masih belajar MVC 3 dan ini telah menghindarkan saya.
— Todd Richardson

3
@ Lorenzo, +1 Saya menggunakan MVC 3 terbaru dengan razorsintaks dan Html.Rawpasti tersedia untuk saya.
— Chris Snowden

1
Lorenzo, saya telah memperbarui jawaban untuk menghapus penyebutan MVC Beta seperti beberapa tahun yang lalu. Merasa bebas untuk kembali / berubah.
— Alexei Levenkov

75

Di ASP.NET MVC 3 Anda harus melakukan sesuatu seperti ini:

// Say you have a bit of HTML like this in your controller:
ViewBag.Stuff = "<li>Menu</li>"
//  Then you can do this in your view:
@MvcHtmlString.Create(ViewBag.Stuff)

13
Saya lebih suka metode ini karena HTML.Raw meledak jika string yang dikirimkan adalah nol.
— 37Stars

1
Terima kasih, ini sangat bersih!
— Hajjat

64

Kamu bisa menggunakan

@{ WriteLiteral("html string"); }

5
Ini luar biasa bagi saya, menggunakan Razor dalam aplikasi Hangfire untuk mengirim email ... Html.Raw()tidak berfungsi di sana
— shanabus

1 untuk WriteLiteral
— muhammed basil

11

Terkadang sulit untuk menggunakan html mentah. Sebagian besar karena kerentanan XSS. Jika itu merupakan masalah, tetapi Anda masih ingin menggunakan html mentah, Anda dapat menyandikan bagian-bagian yang menakutkan.

@Html.Raw("(<b>" + Html.Encode("<script>console.log('insert')</script>" + "Hello") + "</b>)")

Hasil dalam

(<b>&lt;script&gt;console.log('insert')&lt;/script&gt;Hello</b>)

4

Anda bisa meletakkan string Anda ke dalam viewdata di controller seperti ini:

 ViewData["string"] = DBstring;

Dan kemudian panggil viewdata tersebut dalam tampilan seperti ini:

@Html.Raw(ViewData["string"].ToString())


0

Contoh lengkap untuk menggunakan fungsi template di RazorEngine (untuk pembuatan email, misalnya):

@model SomeModel
@{
    Func<PropertyChangeInfo, object> PropInfo =
        @<tr class="property">
            <td>
                @item.PropertyName                
            </td>
            <td class="value">
                <small class="old">@item.OldValue</small>
                <small class="new">@item.CurrentValue</small>                
            </td>
        </tr>;
}

<body>

@{ WriteLiteral(PropInfo(new PropertyChangeInfo("p1", @Model.Id, 2)).ToString()); }

</body>
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.