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?
Utilisez HttpUtility.HtmlEncode puis effectuez le remplacement.
@Html.Raw(HttpUtility.HtmlEncode(Message).Replace("\n", "<br/>"))
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.
Vous pouvez encoder votre message, puis l'afficher brut. Quelque chose comme:
@Html.Raw(Server.HtmlEncode(Message).Replace("\n", "<br/>"))
Pour ceux qui utilisent AntiXssEncoder.HtmlEncode
En tant qu'AntiXssEncoder.HtmlEncode, codez le caractère/r/n en
afin que l'instruction soit
_mDraftMsgModel.wnItem.Description = AntiXssEncoder.HtmlEncode(draftModel.txtMsgContent, false).Replace(" ", "<br/>");
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/>"))