asp.net-mvc asp.net-mvc-3 html-encode

asp.net mvc - HTML.Encode pero preserva los saltos de línea



razor c# (5)

En mi caso, mi cadena contenía html que quería codificar, pero también quería que los saltos de línea HTML permanecieran en su lugar. El código siguiente convierte los saltos de línea HTML en / n y luego codifica todo. Luego vuelve todas las instancias de / n a saltos de línea HTML:

@Html.Raw(HttpUtility.HtmlEncode(message.Replace("<br/>", "/n").Replace("<br />", "/n")).Replace("/n", "<br/>"))

Tomo la entrada del usuario en un área de texto, la almacena y eventualmente la devuelvo al usuario.

En mi View (Razor) quiero hacer algo como esto ...

@Message.Replace("/n", "</br>")

Esto no funciona porque Razor Html Encodes de forma predeterminada. Esto es genial, pero quiero mis saltos de línea.

Si hago esto, me abrirán a los problemas de XSS.

@Html.Raw(Message.Replace("/n", "</br>"))

¿Cuál es la forma correcta de manejar esta situación?


Para aquellos que usan AntiXssEncoder.HtmlEncode

Como AntiXssEncoder.HtmlEncode codifica el carácter / r / n a &#13;&#10; por lo que la declaración debe ser

_mDraftMsgModel.wnItem.Description = AntiXssEncoder.HtmlEncode(draftModel.txtMsgContent, false).Replace("&#13;&#10;", "<br/>");


Puedes codificar tu mensaje y luego mostrarlo en bruto. Algo como:

@Html.Raw(Server.HtmlEncode(Message).Replace("/n", "<br/>"))


Si te encuentras usando esto más de una vez, puede ser útil envolverlo en un HtmlHelper personalizado como este:

namespace Helpers { public static class ExtensionMethods { public static IHtmlString PreserveNewLines(this HtmlHelper htmlHelper, string message) { return message == null ? null : htmlHelper.Raw(htmlHelper.Encode(message).Replace("/n", "<br/>")); } } }

Luego podrá usar su HtmlHelper personalizado de la siguiente manera:

@Html.PreserveNewLines(Message)

Tenga en cuenta que deberá agregar un uso al espacio de nombres de Ayudantes para que HtmlHelper esté disponible.


Use HttpUtility.HtmlEncode y luego reemplace.

@Html.Raw(HttpUtility.HtmlEncode(Message).Replace("/n", "<br/>"))