web-dev-qa-db-fra.com

Emission de chaînes non codées dans une vue Razor

Comme ScottGu le dit dans son blog post «par défaut, le contenu émis à l’aide d’un bloc @ est automatiquement codé en HTML pour une meilleure protection contre les scénarios d’attaques XSS» . chaîne?

Par souci de simplicité, les pls s'en tiennent à ce cas simple:

@{
 var html = "<a href='#'>Click me</a>"
 // I want to emit the previous string as pure HTML code...
}
76
hemme

Ceci est mon approche préférée:

@Html.Raw("<p>my paragraph text</p>")

La source était la référence de la syntaxe Razor de Phil Haack: http://haacked.com/archive/2011/01/06/razor-syntax-quick-reference.aspx

108
miguelv

Vous pouvez créer une nouvelle instance de MvcHtmlString qui ne sera pas codée en HTML.

@{
  var html = MvcHtmlString.Create("<a href='#'>Click me</a>")
}

Espérons qu'il y aura un moyen plus facile dans l'avenir de Razor.

Si vous n'utilisez pas MVC, vous pouvez essayer ceci:

@{
  var html = new HtmlString("<a href='#'>Click me</a>")
}
17
aolde

le nouveau HtmlString est la solution.

Nous avons examiné d'autres modifications de la syntaxe du rasoir, mais aucun d'entre eux n'a finalement été plus court que le nouveau HtmlString.

Nous pouvons, cependant, envelopper cela dans une aide. Peut-être...

@Html.Literal("<p>something</p>")

ou 

@"<p>something</p>".AsHtml()
6
Erik Porter

J'ai rencontré ce problème également lors de la transition de notre projet vers le nouveau moteur d'affichage Razor. L’approche que j’ai adoptée était légèrement différente, car nous devions générer des données JSON à partir de C # et souhaitions les générer au chargement de la page.

Ce que j'ai finalement fait est d'implémenter un RawView qui était un parallèle de View à l'intérieur des fichiers cshtml. Essentiellement, pour obtenir une chaîne brute,

@(new HtmlString(View.Foo))

// became
@RawView.Foo

Cela nécessite quelques modifications dans la mise en page du projet, alors je viens de rédiger un article de blog à ce sujet ici . En bref, cela nécessitait une implémentation en double de DynamicViewDataDictionary de MVC et un nouveau WebViewPage contenant le RawView. Je suis également allé de l'avant et mis en œuvre l'opérateur d'index sur le RawView pour permettre

@RawView["Foo"]

Il est fort probable que quelqu'un ait besoin de parcourir les données avec une liste de clés.

En lisant le commentaire d’une infirmière, il aurait probablement été préférable que j’appelle cela littéral plutôt que RawView.

0
Anh-Kiet Ngo

J'utilise ASP.NET MVC et Razor sous Mono. 

Je ne pouvais pas obtenir HtmlHelper de System.Web.WebPages de System.Web.Mvc pour certaines raisons. 

Mais j'ai réussi à générer une chaîne non codée après avoir déclaré la propriété du modèle sous la forme RazorEngine.Text.RawString. Maintenant, il sort comme prévu.

Exemple

@{
    var txt = new RawString("some text with \"quotes\"");
    var txt2 = "some text with \"quotes\"";
}
<div>Here is unencoded text: @txt</div>
<div>Here is encoded text: @txt2</div>

Sortie:

<div>Here is unencoded text: some text with "quotes"</div>
<div>Here is encoded text: some text with &quot;quotes&quot;</div>
0
porfirion