Mam bezpieczny / zdezynfekowany HTML zapisany w tabeli DB.
Jak mogę zapisać tę treść HTML w widoku Razor?
Zawsze ucieka przed znakami takimi jak <
i do & &
.
Mam bezpieczny / zdezynfekowany HTML zapisany w tabeli DB.
Jak mogę zapisać tę treść HTML w widoku Razor?
Zawsze ucieka przed znakami takimi jak <
i do & &
.
Odpowiedzi:
Załóżmy, że treść znajduje się w ciągu o nazwie mystring
...
Możesz użyć:
@Html.Raw(mystring)
Alternatywnie możesz przekonwertować ciąg na HtmlString
dowolny inny typ implementujący IHtmlString
w modelu lub bezpośrednio w wierszu i używać zwykłego @
:
@{ var myHtmlString = new HtmlString(mystring);}
@myHtmlString
razor
składnią i Html.Raw
jest dla mnie zdecydowanie dostępny.
W ASP.NET MVC 3 powinieneś zrobić coś takiego:
// 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)
Czasami użycie surowego HTML może być trudne. Głównie z powodu podatności XSS. Jeśli jest to problem, ale nadal chcesz używać surowego HTML, możesz zakodować przerażające części.
@Html.Raw("(<b>" + Html.Encode("<script>console.log('insert')</script>" + "Hello") + "</b>)")
Prowadzi do
(<b><script>console.log('insert')</script>Hello</b>)
Oprócz używania @MvcHtmlString.Create(ViewBag.Stuff)
zgodnie z sugestią Dommera, sugeruję również korzystanie z biblioteki AntiXSS zgodnie z zaleceniami phill http://haacked.com/archive/2010/04/06/using-antixss-as-the-default-encoder-for-asp -net.aspx
Koduje prawie wszystkie możliwe ciągi ataku XSS.
Kompletny przykład użycia funkcji szablonów w RazorEngine (na przykład do generowania wiadomości e-mail):
@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()