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 &
.
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 &
.
Jawaban:
Andaikata konten Anda ada di dalam sebuah string bernama mystring
...
Kamu bisa menggunakan:
@Html.Raw(mystring)
Atau Anda dapat mengkonversi string Anda ke HtmlString
atau jenis lain yang mengimplementasikan IHtmlString
dalam model atau langsung inline dan gunakan biasa @
:
@{ var myHtmlString = new HtmlString(mystring);}
@myHtmlString
razor
sintaks dan Html.Raw
pasti tersedia untuk saya.
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)
Kamu bisa menggunakan
@{ WriteLiteral("html string"); }
Html.Raw()
tidak berfungsi di sana
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><script>console.log('insert')</script>Hello</b>)
Selain menggunakan @MvcHtmlString.Create(ViewBag.Stuff)
seperti yang disarankan oleh Dommer, saya sarankan Anda juga menggunakan perpustakaan AntiXSS seperti yang disarankan phill http://haacked.com/archive/2010/04/06/using-antixss-as-the-default-encoder-for-asp -net.aspx
Ini mengkodekan hampir semua string serangan XSS yang mungkin.
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>
@Html.Raw()