J'ai un contrôleur qui génère une chaîne contenant des balises HTML. Maintenant, lorsque je l'affiche dans des vues, elle s'affiche sous forme d'une simple chaîne contenant toutes les balises. J'ai essayé d'utiliser HTML helper 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 mes vues,
@Html.Encode(str)
Vous êtes proche, vous voulez utiliser @Html.Raw(str)
@Html.Encode
prend 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.
Vous devriez utiliser IHtmlString
à la place:
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 la question de savoir si vos données sont au format HTML est conservée dans votre contrôleur. Dans un environnement où vous avez à la fois des développeurs front-end et back-end, ceux-ci peuvent être plus en phase avec les données pouvant contenir des valeurs HTML, laissant 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 est que je ne sais pas où vous attribuez str
, mais quelques points qui me préoccupent quant à la manière dont vous pouvez mettre cela en œuvre.
Tout d'abord, cela devrait être fait dans un contrôleur, quelle que soit votre solution (IHtmlString
ou Html.Raw
). À votre avis, vous devriez éviter toute logique de ce genre, car elle n’y appartient pas vraiment.
De plus, vous devriez utiliser votre ViewModel
pour obtenir des valeurs dans votre vue (et encore, idéalement, en utilisant IHtmlString
comme 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.
vous pouvez utiliser @Html.Raw(str)
Voir MSDN pour plus d'informations
Renvoie une balise qui n'est pas codée HTML.
Cette méthode englobe le balisage HTML à l'aide de la classe IHtmlString, qui restitue du code HTML non codé.
J'ai eu un problème similaire avec les champs de saisie HTML dans MVC. La page Web paginée ne montre que le premier mot clé du champ. Exemple: champ de saisie: "Le renard brun rapide" Valeur affichée: "Le"
La solution consistait à 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">
J'ai eu un problème similaire récemment, et google m'a atterri ici, alors je mets cette réponse ici au cas où d'autres y atterrissent également, par souci d'exhaustivité.
J'ai remarqué que lorsque j'avais html mal formaté, j'avais en fait toutes mes balises html ont été supprimées, avec seulement le contenu non-tag restant . J'avais particulièrement une table avec une balise de table d'ouverture manquante, puis toutes mes balises html de la chaîne entière étaient complètement déchirées.
Donc, si ce qui précède ne fonctionne pas et que vous vous grattez encore la tête, alors aussi vérifiez votre code HTML pour être 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 que le nettoyage est en cours (MVC 5) et que lorsque cela ne peut pas se produire, il supprime toutes/certaines balises.