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

AGS
sumber
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
Lorenzo
sumber
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)
Tom Chantler
sumber
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"); }
Andrus
sumber
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>)
Travis J
sumber
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())
Ajay
sumber
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>
ZlobnyiSerg
sumber