Remplacer les caractères de rupture de ligne par in ASP.NET MVC Razor view

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

@Model.CommentText

encodage correct de toutes les valeurs. Cependant, je veux remplacer les caractères de rupture de ligne par <br /> et je ne peux pas trouver un moyen de m'assurer que les nouvelles balises br ne sont pas encodées. J'ai essayé D'utiliser HtmlString mais je n'ai pas encore eu de chance.

220
demandé sur Omar 2010-11-19 01:42:01

6 réponses

utilisez la CSS white-space au lieu de vous ouvrir aux vulnérabilités XSS!

<span style="white-space: pre-line">@Model.CommentText</span>
583
répondu Jacob Krall 2017-11-21 19:07:03

essayez ce qui suit:

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

mise à jour:

selon marcind's commentaire sur cette question connexe , le ASP.NET MVC team cherche à mettre en œuvre quelque chose de similaire au <%: et <%= pour le moteur de Razor view.

Maj 2:

nous pouvons transformer n'importe quelle question sur l'encodage HTML en une discussion sur les entrées d'utilisateur nuisibles, mais assez de cela il existe déjà.

quoi qu'il en soit, prenez soin de l'entrée potentiellement nuisible 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 />"))
104
répondu Omar 2017-05-23 11:54:43

Split sur les retours à la ligne (environnement agnostique) et d'imprimer régulièrement, pas besoin de s'inquiéter à propos de l'encodage ou xss:

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

(supprimer les rubriques vides est facultatif)

9
répondu drzaus 2014-12-09 14:23:26

la troisième solution D'Omar comme Helper HTML serait:

public static IHtmlString FormatNewLines(this HtmlHelper helper, string input)
{
    return helper.Raw(helper.Encode(input).Replace("\n", "<br />"));
}
7
répondu thelem 2015-11-02 11:43:30

application du dry principle à la solution D'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));
        }
    }
}
"151920920 d'Utilisation" (avec l'amélioration des regex):

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

cela a également l'avantage supplémentaire de mettre moins de fardeau sur le développeur de Razor View pour assurer la sécurité des vulnérabilités XSS.


mon souci avec la solution de Jacob est que le fait de rendre la ligne se brise avec CSS breaks la sémantique HTML .

4
répondu Akaoni 2013-01-02 23:59:01

j'ai eu besoin de casser quelques textes en paragraphes ("p" tags), donc j'ai créé un assistant simple en utilisant certaines des recommandations dans les 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);
    }

Utilisation:

@Html.ToParagraphs(Model.Comments)
4
répondu Andrea 2014-03-26 23:44:20