Reemplazar caracteres de salto de línea con in ASP.NET MVC Razor ver


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

@Modelo.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 asegurarse de que las nuevas etiquetas br no obtener codificados. He intentado usar htmlString pero aún no he tenido suerte.

Author: Omar, 2010-11-19

6 answers

Utilice la propiedad CSS white-space en lugar de abrirse a las vulnerabilidades XSS!

<span style="white-space: pre-line">@Model.CommentText</span>
 583
Author: Jacob Krall,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-21 19:07:03

Intente lo siguiente:

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

Actualización:

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

Actualización 2:

Podemos convertir cualquier pregunta sobre la codificación HTML en una discusión sobre las entradas dañinas del usuario, pero ya existe suficiente de eso.

De todos modos, tenga cuidado de la entrada de usuario potencialmente dañina.

@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 />"))
 104
Author: Omar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:54:43

Dividir en nuevas líneas (independiente del entorno) e imprimir regularmente no no hay necesidad de preocuparse 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)

 9
Author: drzaus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-09 14:23:26

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

public static IHtmlString FormatNewLines(this HtmlHelper helper, string input)
{
    return helper.Raw(helper.Encode(input).Replace("\n", "<br />"));
}
 7
Author: thelem,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-02 11:43:30

Aplicando el principio SECO 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 expresiones regulares mejoradas):

@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 XSS.


Mi preocupación con la solución de Jacob es que renderizar los saltos de línea con CSS rompe la semántica HTML.

 4
Author: Akaoni,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-01-02 23:59:01

Necesitaba dividir algo de texto en párrafos (etiquetas"p"), así que creé un ayudante simple usando algunas de las recomendaciones de las 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 = "<p>" + String.Join("</p><p>", arr) + "</p>";
        return MvcHtmlString.Create(htmlStr);
    }

Uso:

@Html.ToParagraphs(Model.Comments)
 4
Author: Andrea,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-26 23:44:20