Afficher la chaîne au format HTML dans la vue mvc asp.net

98

J'ai un contrôleur qui génère une chaîne contenant des balises html.Maintenant, lorsque je l'affiche sur les vues, elle s'affiche sous forme de chaîne simple contenant toutes les balises. J'ai essayé d'utiliser l'aide Html pour encoder / décoder pour l'afficher correctement, mais cela ne fonctionne pas.

string str= "<a href="/Home/Profile/seeker">seeker</a> has applied to <a href="/Jobs/Details/9">Job</a> floated by you.</br>";

Sur mon point de vue,

@Html.Encode(str)
Mukesh Sharma
la source
6
Je suppose que ça Html.Rawdevrait aider.
Saeed Neamati
Aussi, je pense que vous pouvez utiliser la HtmlStrinclasse, comme dansHtmlString str = new HtmlString("<span>Some HTML here</span>");
Saeed Neamati

Réponses:

168

Vous êtes proche que vous souhaitez utiliser @Html.Raw(str)

@Html.Encodeprend des chaînes et s'assure que tous les caractères spéciaux sont gérés correctement. Ceux-ci incluent des caractères comme des espaces.

Jared
la source
6
@ Html.Raw est exactement ce que je cherchais, merci pour la réponse :)
AFract
IHtmlString comme mentionné par @Jerad Rose est beaucoup mieux
Pratyush Dhanuka
37

Vous devriez utiliser à la IHtmlStringplace:

IHtmlString str = new HtmlString("<a href="/Home/Profile/seeker">seeker</a> has applied to <a href="/Jobs/Details/9">Job</a> floated by you.</br>");

Chaque fois que vous avez des propriétés de modèle ou des variables qui doivent contenir du HTML, je pense que c'est généralement une meilleure pratique. Tout d'abord, c'est un peu plus propre. Par exemple:

@Html.Raw(str)

Par rapport à:

@str

De plus, je pense aussi que c'est un peu plus sûr que d'utiliser @Html.Raw(), car le souci de savoir si vos données sont HTML est conservé dans votre contrôleur. Dans un environnement où vous avez des développeurs front-end vs back-end, vos développeurs back-end peuvent être plus en phase avec les données pouvant contenir des valeurs HTML, gardant ainsi cette préoccupation dans le back-end (contrôleur).

J'essaie généralement d'éviter d'utiliser Html.Raw()autant que possible.

Une autre chose à noter, c'est que je ne sais pas où vous attribuez str, mais quelques points qui me préoccupent quant à la façon dont vous pourriez l'implémenter.

Tout d'abord, cela doit être fait dans un contrôleur, quelle que soit votre solution ( IHtmlStringou Html.Raw). Vous devriez éviter toute logique comme celle-ci à votre avis, car elle n'y appartient pas vraiment.

De plus, vous devriez utiliser votre ViewModelpour obtenir des valeurs dans votre vue (et encore une fois, idéalement en utilisant IHtmlStringcomme type de propriété). Voir quelque chose comme @Html.Encode(str)est un peu inquiétant, à moins que vous ne le fassiez juste pour simplifier votre exemple.

Jerad Rose
la source
1
Je tiens à souligner que les contrôleurs sont destinés au routage et non au stockage de données. De plus, vos développeurs back-end devraient savoir mieux que jamais changer le contrat existant du code. L'interface utilisateur doit être liée à un modèle et si le modèle change radicalement, vos tests unitaires doivent être interrompus.
Anthony Mason
Merci pour votre réponse. Je l'aime.
Thomas.Benz
Oui, cette réponse est bien meilleure, j'ai initialement utilisé Html.Raw, mais quand j'ai lu cette réponse, j'ai changé immédiatement
Pratyush Dhanuka
7

vous pouvez utiliser @Html.Raw(str)

Voir MSDN pour plus

Renvoie un balisage qui n'est pas encodé en HTML.

Cette méthode encapsule le balisage HTML à l'aide de la classe IHtmlString, qui restitue du HTML non codé.

AthibaN
la source
1

J'ai eu un problème similaire avec les champs d'entrée HTML dans MVC. Le site Web paginé n'affiche que le premier mot-clé du champ. Exemple: champ de saisie: "Le renard brun rapide" Valeur affichée: "Le"

La résolution était de mettre la variable entre guillemets dans la déclaration de valeur comme suit:

<input class="ParmInput" type="text" id="respondingRangerUnit" name="respondingRangerUnit"
       onchange="validateInteger(this.value)" value="@ViewBag.respondingRangerUnit">
Roland Pays de Galles
la source
0

J'ai eu un problème similaire récemment, et Google m'a atterri ici, donc je mets cette réponse ici au cas où d'autres atterriraient ici aussi, par souci d'exhaustivité.

J'ai remarqué que lorsque j'avais du HTML mal formaté , j'avais en fait toutes mes balises html supprimées , avec juste le contenu non-tag restant . J'avais en particulier une table avec une balise de table d'ouverture manquante, puis toutes mes balises html de la chaîne entière étaient complètement arrachées.

Donc, si ce qui précède ne fonctionne pas et que vous vous grattez toujours la tête, vérifiez également que votre code HTML est valide.

Je remarque que même après l'avoir fait fonctionner, MVC ajoutait des balises tbody là où je n'en avais pas. Cela me dit qu'il y a un nettoyage en cours (MVC 5), et que quand cela ne peut pas arriver, il supprime toutes / certaines balises.

Greg
la source