web-dev-qa-db-fra.com

Comment fonctionne l'assistant MVC Html.Raw?

J'utilise Html.Raw pour imprimer un contenu html brut, par exemple lorsque j'envoie quelque chose comme ViewBag.div = "<div> Hello </div>"; Du contrôleur vers la vue, il n'imprime pas de contenu html brut sauf si j'utilise le Html.Raw mais si j'ai un contenu encodé, comme du contenu encodé en utilisant jquery et inséré dans la base de données et que je veux l'imprimer en tant que contenu html brut, la méthode Html.Raw ne fonctionne pas et je dois utiliser HttpUtility.HtmlDecode(EncodedContent) avant d'utiliser Html.Raw, alors s'il vous plaît quelqu'un pourrait-il expliquer pourquoi il agit de cette manière et quelle est la situation appropriée pour utiliser la méthode Html.Raw? ou d'une autre manière, pourquoi Html.Raw ne fonctionne pas lorsqu'il reçoit des entités html en tant que paramètre au lieu de balises html?.

8
user3260672

Parce que les caractères encodés sont HTML et que la version Raw de cette chaîne est celle encodée.


Html.Raw rend ce qu'il est donné sans faire de codage html, donc avec ViewBag.div = "<div> Hello </div>";:

@Html.Raw(ViewBag.div);

Rendu

<div> Hello </div>

Cependant, lorsque vous y avez encodé des caractères, tels que ViewBag.Something = "&gt;";, La version brute est &gt;. Pour revenir au HTML réel, vous devez Html.Raw(HttpUtility.HtmlDecode(EncodedContent)); comme vous l'avez dit.

Si Html.Raw faisait le décodage, ce serait déroutant, et nous aurions besoin de quelque chose qui ne le fasse pas. ;-)

18
NikolaiDante

Html.Raw La méthode demande au Razor Engine de ne pas coder les caractères spéciaux .

Razor Engine encode les caractères spéciaux, car il considère que vous souhaitez les afficher dans l'état que vous leur avez envoyé, de sorte qu'il encode les caractères spéciaux et le navigateur les décode à nouveau pour vous les montrer dans l'état d'origine (l'état que vous avez envoyé à la razor engine), mais si vous utilisez le Html.Rawcela signifie que vous demandez au moteur Razor de ne pas coder les caractères spéciaux de votre contenu et en fait cela ne signifie pas que vous lui demandez de décoder votre contenu codé tel que le contenu que vous obtenez de la base de données, il suffit de demander au moteur de ne pas coder les caractères spéciaux = donc si vous avez un contenu encodé dans la base de données, vous devez le décoder en utilisant HttpUtility.HtmlDecode puis demander au moteur de rasoir de ne pas encoder les balises html retournées en utilisant Html.Raw.

Par exemple si vous avez ce contenu dans votre base de données

&lt;h1&gt;dklxf;&lt;span style="font-style: italic;"&gt;kldk;dlk&lt;span style="font-weight: bold;"&gt;dxl'f;dlxd'fdlf;ldk;dlkf&lt;/span&gt;&lt;/span&gt;&lt;/h1&gt;

maintenant, si vous l'imprimez sans utiliser HTML.Raw, le moteur de rasoir encodera les caractères spéciaux dans ce contenu à imprimer dans le navigateur tel quel, mais si vous utilisez HTML.Raw, cela signifie de ne rien faire sur le contenu afin que le navigateur les rende comme un ensemble de balises html qui contiennent un contenu mais pas des données formatées, vous obtiendrez quelque chose comme:

<h1>dklxf;<span style="font-style: italic;">kldk;dlk<span style="font-weight: bold;">dxl'f;dlxd'fdlf;ldk;dlkf</span></span></h1></p>

mais si vous utilisez Html.Raw(HttpUtility.HtmlDecode(EncodedContent)) alors vous obtiendrez des données formatées dans votre page comme le contenu suivant car le contenu envoyé au navigateur est des balises html et non des entités

dklxf;kldk; dlkdxl'f; dlxd'fdlf; ldk; dlkf

3
Mohamad