web-dev-qa-db-fra.com

Remplacez les caractères de saut de ligne par <br /> dans la vue ASP.NET MVC Razor

J'ai un contrôle textarea qui accepte les entrées. J'essaie de rendre ultérieurement ce texte à une vue en utilisant simplement:

@ Model.CommentText

Ceci encode correctement les valeurs. Cependant, je souhaite remplacer les caractères de saut de ligne par <br /> et je ne trouve pas le moyen de m'assurer que les nouvelles balises br ne sont pas codées. J'ai essayé d'utiliser HtmlString mais je n'ai pas encore eu de chance.

231
bkaid

Utilisez le propriété CSS white-space au lieu de vous ouvrir aux vulnérabilités XSS!

<span style="white-space: pre-line">@Model.CommentText</span>
627
Jacob Krall

Essayez ce qui suit:

@MvcHtmlString.Create(Model.CommentText.Replace(Environment.NewLine, "<br />"))

Mise à jour:

Selon marcind's comment on cette question connexe , l'équipe ASP.NET MVC cherche à implémenter quelque chose de similaire aux <%: et <%= du moteur d'affichage Razor. .

Mise à jour 2:

Toute question sur le codage HTML peut être transformée en une discussion sur les entrées utilisateur nuisibles, mais il en existe déjà assez.

Quoi qu’il en soit, prenez en compte les informations potentiellement nuisibles de l’utilisateur.

@MvcHtmlString.Create(Html.Encode(Model.CommentText).Replace(Environment.NewLine, "<br />"))

Mise à jour 3 (Asp.Net MVC 3):

@Html.Raw(Html.Encode(Model.CommentText).Replace("\n", "<br />"))
114
Omar

La troisième solution d'Omar en tant qu'assistant HTML serait:

public static IHtmlString FormatNewLines(this HtmlHelper helper, string input)
{
    return helper.Raw(helper.Encode(input).Replace("\n", "<br />"));
}
10
thelem

Découpez les nouvelles lignes (sans tenir compte de l'environnement) et imprimez régulièrement - inutile de vous soucier de l'encodage ou de xss:

@if (!string.IsNullOrWhiteSpace(text)) 
{
    var lines = text.Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);
    foreach (var line in lines)
    {
        <p>@line</p>
    }
}

(supprimer les entrées vides est facultatif)

9
drzaus

J'avais besoin de séparer du texte en paragraphes (balises "p"), j'ai donc créé une aide simple en utilisant certaines des recommandations des réponses précédentes (merci les gars).

public static MvcHtmlString ToParagraphs(this HtmlHelper html, string value) 
    { 
        value = html.Encode(value).Replace("\r", String.Empty);
        var arr = value.Split('\n').Where(a => a.Trim() != string.Empty);
        var htmlStr = "<p>" + String.Join("</p><p>", arr) + "</p>";
        return MvcHtmlString.Create(htmlStr);
    }

Usage:

@Html.ToParagraphs(Model.Comments)
4
Andrea

En appliquant le principe DRY à la solution Omar, voici une extension HTML Helper:

using System.Web.Mvc;
using System.Text.RegularExpressions;

namespace System.Web.Mvc.Html {
    public static class MyHtmlHelpers {
        public static MvcHtmlString EncodedReplace(this HtmlHelper helper, string input, string pattern, string replacement) {
            return new MvcHtmlString(Regex.Replace(helper.Encode(input), pattern, replacement));
        }
    }
}

Utilisation (avec regex amélioré):

@Html.EncodedReplace(Model.CommentText, "[\n\r]+", "<br />")

Cela présente également l’avantage supplémentaire de donner moins de fardeau au développeur Razor View pour assurer la sécurité contre les vulnérabilités XSS.


Mon souci avec la solution de Jacob est que le rendu des sauts de ligne avec CSS rompt le sémantique HTML .

4
Akaoni