web-dev-qa-db-fra.com

HTML.Encode mais préserve les sauts de ligne

Je prends la saisie de l'utilisateur dans une zone de texte, la stocke et l'affiche à l'utilisateur.

Dans ma vue (rasoir) je veux faire quelque chose comme ça ...

@Message.Replace("\n", "</br>")

Cela ne fonctionne pas car Razor Html Encode par défaut. C’est génial, mais je veux mes sauts de ligne. 

Si je le fais, je suis ouvert aux problèmes XSS. 

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

Quelle est la bonne façon de gérer cette situation? 

35
BZink

Utilisez HttpUtility.HtmlEncode puis effectuez le remplacement.

@Html.Raw(HttpUtility.HtmlEncode(Message).Replace("\n", "<br/>"))
43

Si vous utilisez ceci plus d'une fois, il peut être utile de l'envelopper dans un HtmlHelper personnalisé comme ceci:

namespace Helpers
{
    public static class ExtensionMethods
    {
        public static IHtmlString PreserveNewLines(this HtmlHelper htmlHelper, string message)
        {
            return message == null ? null : htmlHelper.Raw(htmlHelper.Encode(message).Replace("\n", "<br/>"));
        }
    }
}

Vous pourrez alors utiliser votre HtmlHelper personnalisé comme ceci:

@Html.PreserveNewLines(Message)

Gardez à l'esprit que vous devez ajouter un using à votre espace de noms Helpers pour que HtmlHelper soit disponible.

13
Tony Borres

Vous pouvez encoder votre message, puis l'afficher brut. Quelque chose comme:

@Html.Raw(Server.HtmlEncode(Message).Replace("\n", "<br/>"))
9
Erik Funkenbusch

Pour ceux qui utilisent AntiXssEncoder.HtmlEncode

En tant qu'AntiXssEncoder.HtmlEncode, codez le caractère/r/n en &#13;&#10; afin que l'instruction soit 

_mDraftMsgModel.wnItem.Description = AntiXssEncoder.HtmlEncode(draftModel.txtMsgContent, false).Replace("&#13;&#10;", "<br/>");
1
CodeSi

Dans mon cas, ma chaîne contenait du code HTML que je voulais encoder, mais je voulais également que les sauts de ligne HTML restent en place. Le code ci-dessous transforme la ligne HTML en\n, puis encode tout. Il retourne ensuite toutes les occurrences de\n en sauts de ligne HTML:

@Html.Raw(HttpUtility.HtmlEncode(message.Replace("<br/>", "\n").Replace("<br />", "\n")).Replace("\n", "<br/>"))
0
Dave Lucre