Reemplace los caracteres de salto de línea con en ASP.NET MVC Razor view

Tengo un control de área de texto que acepta entrada. Estoy tratando de renderizar ese texto a una vista simplemente usando:

@ Model.CommentText

Esto está codificando correctamente cualquier valor. Sin embargo, quiero reemplazar los caracteres de salto de línea con
y no puedo encontrar la manera de asegurarme de que las nuevas tags br no se codifiquen. He intentado usar HtmlString pero todavía no he tenido suerte.

¡Usa la propiedad de espacio en blanco de CSS en lugar de abrirte a las vulnerabilidades de XSS!

 @Model.CommentText 

Pruebe lo siguiente:

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

Actualizar:

De acuerdo con marcind's comentario marcind's sobre esta cuestión relacionada , el equipo ASP.NET MVC está buscando implementar algo similar a los < %: y < %= para el motor de vista Razor.

Actualización 2:

Podemos convertir cualquier pregunta sobre encoding HTML en una discusión sobre entradas de usuarios dañinos, pero ya existe suficiente.

De todos modos, ocúpese de la posible entrada de usuarios dañinos.

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

Actualización 3 (Asp.Net MVC 3):

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

Dividir en nuevas líneas (sin tener en cuenta el entorno) e imprimir con regularidad, sin necesidad de preocuparse por la encoding o xss:

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

@line

} }

(eliminar entradas vacías es opcional)

La tercera solución de Omar como HTML Helper sería:

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

Aplicando el principio DRY a la solución de Omar, aquí hay una extensión de 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)); } } } 

Uso (con expresiones regulares mejoradas):

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

Esto también tiene el beneficio adicional de poner menos onus en el desarrollador de Razor View para garantizar la seguridad de las vulnerabilidades de XSS.


Mi preocupación con la solución de Jacob es que el hecho de que la línea se rompa con CSS rompe la semántica de HTML .

Necesitaba dividir algunos textos en párrafos (tags “p”), así que creé un simple ayudante utilizando algunas de las recomendaciones en respuestas anteriores (gracias chicos).

 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)