Rendu ASP.NET MVC Razor sans encodage

250

Le rasoir code la chaîne par défaut. Existe-t-il une syntaxe spéciale pour le rendu sans encodage?

SiberianGuy
la source

Réponses:

374

Depuis ASP.NET MVC 3, vous pouvez utiliser:

@Html.Raw(myString)
Lucas
la source
8
Ce n'est pas tout à fait correct. Oui, vous pouvez insérer une chaîne brute mais si vous en avez, "'<>etc...elle sera échappée. La bonne façon est d'utiliser le MvcHtmlString qui autorisera les caractères "illégaux". Par exemple, si vous encodez des données Json ... sans encoder un modèle entier
Daniel B. Chapman
4
Daniel, Html.Raw () "renvoie un balisage qui n'est pas codé en HTML."
Lucas
1
Html.Raw () encode les guillemets ..."myAttr='hello';myInt=10"
Serge
4
Il n'encode PAS les guillemets. En plus de la documentation évidente indiquant qu'il clair comme le jour ( « Cette méthode enveloppe HTML balisage en utilisant la classe IHtmlString, ce qui rend non codé HTML. » ) J'ai aussi testé cela et devis ne sont pas codés.
James Wilkins
58
@(new HtmlString(myString))
Matthew Vines
la source
31

En plus de l'approche @ Html.Raw (chaîne) déjà mentionnée, si vous générez un MvcHtmlString, il ne sera pas codé. Cela peut être utile lors de l'ajout de vos propres extensions à HtmlHelper, ou lors du retour d'une valeur de votre modèle de vue qui, vous le savez, peut contenir du html.

Par exemple, si votre modèle de vue était:

public class SampleViewModel
{
  public string SampleString { get; set; }
  public MvcHtmlString SampleHtmlString { get; set; }
}

Pour Core 1.0+ (et MVC 5+), utilisez HtmlString

public class SampleViewModel
{
  public string SampleString { get; set; }
  public HtmlString SampleHtmlString { get; set; }
}

puis

<!-- this will be encoded -->
<div>@Model.SampleString</div>
<!-- this will not be encoded -->
<div>@Html.Raw(Model.SampleString)</div>
<!-- this will not be encoded either -->
<div>@Model.SampleHtmlString</div>
Jonathan Moffatt
la source
10

À utiliser @Html.Raw()avec prudence car vous pourriez causer plus de problèmes d'encodage et de sécurité. Je comprends le cas d'utilisation car je devais le faire moi-même, mais soigneusement ... Évitez simplement de laisser passer tout le texte. Par exemple, ne conservez / convertissez que des séquences de caractères spécifiques et codez toujours le reste:

@Html.Raw(Html.Encode(myString).Replace("\n", "<br/>"))

Ensuite, vous avez la tranquillité d'esprit que vous n'avez pas créé de faille de sécurité potentielle et tous les caractères spéciaux / étrangers s'affichent correctement dans tous les navigateurs.

Tony Wall
la source
+1 Exactement ce dont j'avais besoin! La chaîne doit encore être encodée mais la ligne renvoyée doit être html. Merci!
Peter
@Html.Raw(Html.Encode(myString).Replace(Html.Encode("\n"), "<br/>"))pour ASP.NET Core
kenjiuno
5

Dans le cas d'ActionLink, il utilise généralement HttpUtility.Encode sur le texte du lien. Dans ce cas, vous pouvez l'utiliser, HttpUtility.HtmlDecode(myString) cela a fonctionné pour moi lorsque vous utilisez HtmlActionLink pour décoder la chaîne que je voulais transmettre. par exemple:

  @Html.ActionLink(HttpUtility.HtmlDecode("myString","ActionName",..)

gutsy_guy
la source
1

Vous pouvez également utiliser la méthode WriteLiteral

Hamid Shahid
la source
1

HTML RAW:

@Html.Raw(yourString)
Farbod
la source