Écriture / sortie de chaînes HTML sans échappatoire

436

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

AGS
la source
76
Pour sauver les gens la longue histoire de discussion ci-dessous -@Html.Raw()
Chris S
Pour éviter aux gens comme moi d'essayer de le faire avec des types anonymes dans des vues typées dynamiquement, où cela ne fonctionnera pas - voir cette réponse à ma question plus spécifique. Bien que l'utilisation de cette approche avec une vue fortement typée soit toujours meilleure si votre situation le permet.
brichins

Réponses:

653

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 HtmlStringou tout autre type qui implémente IHtmlStringdans le modèle ou directement en ligne et utiliser régulièrement @:

@{ var myHtmlString = new HtmlString(mystring);}
@myHtmlString
Lorenzo
la source
Merci pour cette réponse. M'a aidé à terminer une petite tâche que j'apprenais. :) Cependant j'utilise la dernière version de MVC3 et jusqu'à présent aucun Html.Raw :(
1
Salut Sergio. J'utilise MVC 3 et j'utilise correctement la méthode Raw.
Gui
1
Merci pour la réponse! J'apprends toujours MVC 3 et cela m'échappait.
Todd Richardson
3
@Lorenzo, +1 J'utilise le dernier MVC 3 avec razorsyntaxe et je suis Html.Rawdéfinitivement disponible.
Chris Snowden
1
Lorenzo, j'ai mis à jour la réponse pour supprimer la mention de MVC Beta comme il y a quelques années. N'hésitez pas à revenir / changer.
Alexei Levenkov
75

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)
Tom Chantler
la source
13
Je préfère cette méthode car HTML.Raw explose si la chaîne passée est nulle.
37Stars
1
Merci, c'est très propre!
Hajjat ​​du
64

Vous pouvez utiliser

@{ WriteLiteral("html string"); }
Andrus
la source
5
C'était génial pour moi, j'utilisais Razor dans une application Hangfire pour envoyer des e-mails ... Html.Raw()ne fonctionne pas là
shanabus
1 pour WriteLiteral
basilic muhammed
11

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>&lt;script&gt;console.log('insert')&lt;/script&gt;Hello</b>)
Travis J
la source
4

Vous pouvez mettre votre chaîne dans viewdata dans le contrôleur comme ceci:

 ViewData["string"] = DBstring;

Et puis appelez ces données de vue en vue comme ceci:

@Html.Raw(ViewData["string"].ToString())
Ajay
la source
0

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>
ZlobnyiSerg
la source