Question

J'ai un contrôle textarea qui accepte la saisie. Je suis en train de rendre plus tard ce texte à une vue en utilisant simplement:

  

@ Model.CommentText

encode correctement toutes les valeurs. Cependant, je veux remplacer les caractères de saut de ligne avec <br /> et je ne peux pas trouver un moyen de faire en sorte que les nouvelles balises br ne sont pas codés. Je l'ai essayé d'utiliser HtmlString mais ai pas encore eu de chance.

Était-ce utile?

La solution

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>

Autres conseils

Essayez ce qui suit:

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

Mise à jour:

Selon commentaire marcind's sur cette question connexe , l'équipe ASP.NET MVC cherche à mettre en œuvre quelque chose de similaire à la <%: et <%= pour le moteur de vue Razor.

Mise à jour 2:

Nous pouvons transformer toute question sur HTML encodage dans une discussion sur les entrées utilisateur nuisibles, mais assez de ce qui existe déjà.

Quoi qu'il en soit, prendre soin d'entrée utilisateur potentiellement dangereux.

@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 />"))

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

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

Split sauts de ligne (environnement agnostique) et imprimer régulièrement - pas besoin de vous soucier de coder 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 entrées vides est en option)

L'application du principe SEC à la solution d'Omar, voici une extension Helper HTML:

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 amélioration regex):

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

Cela a aussi l'avantage de mettre moins qu'il incombe au développeur View Razor pour assurer la sécurité des vulnérabilités XSS.


Mon souci avec la solution de Jacob est que rendre les sauts de ligne avec des pauses CSS HTML sémantique .

je devais briser un texte en paragraphes (balises « p »), donc je créé une aide simple, en utilisant certaines des recommandations contenues 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)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top