Sostituisci i caratteri di interruzione di riga con in ASP.NET MVC Razor view

Ho un controllo textarea che accetta input. Sto cercando di renderlo più tardi a una vista semplicemente usando:

@ Model.CommentText

Questo codifica correttamente qualsiasi valore. Tuttavia, voglio sostituire i caratteri di interruzione di riga con
e non riesco a trovare un modo per assicurarmi che i nuovi tag br non vengano codificati. Ho provato a utilizzare HtmlString ma non ho ancora avuto fortuna.

Usa la proprietà CSS white-space invece di aprirti alle vulnerabilità XSS!

 @Model.CommentText 

Prova quanto segue:

 @MvcHtmlString.Create(Model.CommentText.Replace(Environment.NewLine, "
"))

Aggiornare:

In base al commento marcind's su questa domanda correlata , il team ASP.NET MVC sta cercando di implementare qualcosa di simile a <%: e <%= per il motore di visualizzazione Razor.

Aggiornamento 2:

Possiamo trasformare qualsiasi domanda sulla codifica HTML in una discussione sugli input utente dannosi, ma ne esiste già abbastanza.

Ad ogni modo, prenditi cura di potenziali input dannosi dell'utente.

 @MvcHtmlString.Create(Html.Encode(Model.CommentText).Replace(Environment.NewLine, "
"))

Aggiornamento 3 (Asp.Net MVC 3):

 @Html.Raw(Html.Encode(Model.CommentText).Replace("\n", "
"))

Dividi su newline (agnostico dell’ambiente) e stampa regolarmente: non devi preoccuparti di codifica o xss:

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

@line

} }

(rimuovere le voci vuote è facoltativo)

La terza soluzione di Omar come helper HTML sarebbe:

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

Applicando il principio DRY alla soluzione di Omar, ecco un’estensione 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)); } } } 

Uso (con regex migliorata):

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

Questo ha anche il vantaggio di mettere meno onere sullo sviluppatore Razor View per garantire la sicurezza dalle vulnerabilità XSS.


La mia preoccupazione per la soluzione di Jacob è che il rendering dell’interruzione di riga con i CSS interrompa la semantica HTML .

Avevo bisogno di infrangere del testo in paragrafi (tag “p”), così ho creato un semplice helper usando alcuni dei consigli nelle risposte precedenti (grazie ragazzi).

 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 = "

" + String.Join("

", arr) + "

"; return MvcHtmlString.Create(htmlStr); }

Uso:

 @Html.ToParagraphs(Model.Comments)