J'ai du HTML sécurisé / aseptisé enregistré dans une table DB.
Comment puis-je avoir ce contenu HTML écrit dans une vue Razor?
Il échappe toujours aux personnages comme <
et aux esperluettes &
.
J'ai du HTML sécurisé / aseptisé enregistré dans une table DB.
Comment puis-je avoir ce contenu HTML écrit dans une vue Razor?
Il échappe toujours aux personnages comme <
et aux esperluettes &
.
Réponses:
Supposons que votre contenu se trouve dans une chaîne nommée mystring
...
Vous pouvez utiliser:
@Html.Raw(mystring)
Alternativement, vous pouvez convertir votre chaîne en HtmlString
ou tout autre type qui implémente IHtmlString
dans le modèle ou directement en ligne et utiliser régulièrement @
:
@{ var myHtmlString = new HtmlString(mystring);}
@myHtmlString
razor
syntaxe et je suis Html.Raw
définitivement disponible.
Dans ASP.NET MVC 3, vous devriez faire quelque chose comme ceci:
// 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)
Vous pouvez utiliser
@{ WriteLiteral("html string"); }
Html.Raw()
ne fonctionne pas là
Parfois, il peut être difficile d'utiliser du HTML brut. Principalement à cause de la vulnérabilité XSS. Si c'est un problème, mais que vous souhaitez toujours utiliser du HTML brut, vous pouvez encoder les parties effrayantes.
@Html.Raw("(<b>" + Html.Encode("<script>console.log('insert')</script>" + "Hello") + "</b>)")
Résulte en
(<b><script>console.log('insert')</script>Hello</b>)
En plus d'utiliser @MvcHtmlString.Create(ViewBag.Stuff)
comme suggéré par Dommer, je vous suggère d'utiliser également la bibliothèque AntiXSS comme suggéré phill http://haacked.com/archive/2010/04/06/using-antixss-as-the-default-encoder-for-asp -net.aspx
Il encode presque toute la chaîne d'attaque XSS possible.
Exemple complet d'utilisation des fonctions de modèle dans RazorEngine (pour la génération d'e-mails, par exemple):
@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()