route raw mvc data asp all asp.net-mvc asp.net-mvc-3 razor

raw - Reemplace los caracteres de salto de línea con<br/> en ASP.NET MVC Razor view



razor if (6)

Tengo un control de área de texto que acepta entrada. Más adelante, estoy intentando renderizar ese texto a una vista usando:

@ Model.CommentText

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



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

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

Esto también tiene el beneficio adicional de poner menos responsabilidad 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 la representación de los saltos de línea con CSS rompe la semántica de HTML .


Divídase en las nuevas líneas (agnóstico del entorno) e imprima con regularidad, no se preocupe por la codificación o xss:

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

(eliminar entradas vacías es opcional)


Intenta lo siguiente:

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

Actualizar:

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

Actualización 2:

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

De todos modos, tenga cuidado de la entrada de usuarios potencialmente dañinos.

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

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

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


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

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


Necesitaba dividir un poco de texto en párrafos (etiquetas "p"), así que creé un simple ayudante usando algunas de las recomendaciones de las respuestas anteriores (gracias a todos).

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); }

Uso:

@Html.ToParagraphs(Model.Comments)