Comment gérer les sauts de ligne dans la vue MVC encodée HTML?

je ne suis pas sûr de la meilleure façon de gérer cela. Dans ma vue d'index j'affiche un message qui est contenu dans TempData["message"] . Cela me permet d'afficher certains messages d'erreur ou d'information à l'utilisateur en provenance d'une autre action (par exemple, si un utilisateur essaie d'entrer L'action Edit alors qu'il n'a pas accès, il les renvoie à l'Index avec un message de "vous n'êtes pas autorisé à éditer ces données").

avant d'afficher le message, je cours Html.Encode(TempData["message"]) . Cependant, je suis récemment entré dans la question Où pour les messages plus longs, je veux être en mesure de séparer les lignes via les sauts de ligne ( <br> ). Malheureusement (et évidemment), le <br> est encodé par Html.Encode donc il ne cause pas de rupture de ligne réelle.

Comment traiter correctement les ruptures de ligne dans les chaînes codées Html?

4
demandé sur KallDrexx 2010-10-05 00:19:43

5 réponses

je suis d'accord avec le commentaire de @Roger - il n'y a pas vraiment besoin d'encoder quoi que ce soit sur lequel vous avez un contrôle total.

si vous souhaitez toujours être plus sûr que Désolé (ce qui n'est pas une mauvaise chose), vous pouvez utiliser la Microsoft AntiXss library et utiliser la .GetSafeHtmlFragment(input) méthode-voir HTML assainissement dans la bibliothèque Anti-XSS

p.ex.

<%= AntiXss.GetSafeHtmlFragment(TempData["message"]) %>
3
répondu Charlino 2012-10-23 11:17:31

la solution la plus facile que j'ai vu est:

@MvcHtmlString.Create(Html.Encode(TempData["message"]).Replace(Environment.NewLine, "<br />"))

si vous utilisez une vue de rasoir, vous ne devriez pas avoir à appeler Html.Encodez normalement. Par défaut, Razor html Code toutes les sorties. du blog de Scott Gu présentant Razor :

par défaut, le contenu émis au moyen d'un @ block est automatiquement encodé en HTML pour mieux se protéger contre les scénarios D'attaque XSS.

7
répondu ICodeForCoffee 2013-05-26 17:25:26

FYI, la bibliothèque de protection de web de Microsoft (Bibliothèque A. K. A. Microsoft AntiXSS) les développeurs semblent avoir cassé l'assemblage et tiré toutes les versions précédentes qui fonctionnaient. Il n'est plus une solution viable dans son état actuel. Je cherchais une solution à ce problème avant de lire les commentaires. Les 18 cotes actuelles pour la dernière version sont négatives et se plaignent qu'elle soit cassée sans aucune mise à jour des développeurs donc je ne l'ai même pas essayé.

j'ai choisi la solution de @ICodeForCoffee puisque j'utilise Razor. Il est simple et semble fonctionner assez bien. J'avais besoin de prendre des descriptions potentiellement longues avec des sauts de ligne et de les formater pour que les sauts de ligne se produisent dans la page.

juste pour être complet, voici le code que j'ai utilisé qui est le code de @ICodeForCoffee modifié pour utiliser le champ de description du modèle de la vue:

@MvcHtmlString.Create(Html.Encode(Model.Description).Replace(Environment.NewLine, "<br />"))
3
répondu TheUO 2012-08-24 21:58:00

"Processus", le message dans le contrôleur:

  1. HTMLEncode le message
  2. insérer les balises de rupture de ligne
  3. ajouter message à la collection TempData.
0
répondu Dave Swersky 2010-10-04 20:27:08

essayez ceci:

StringBuilder sb = new StringBuilder();

foreach(string message in messages)
{
sb.Append(string.Format("{0}<br />", Server.HtmlEncode(message));
}

TempData["message"] = sb.ToString();
0
répondu Andy Evans 2012-08-25 03:08:01