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
por lo que la declaración debe ser
_mDraftMsgModel.wnItem.Description = AntiXssEncoder.HtmlEncode(draftModel.txtMsgContent, false).Replace(" ", "<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/>"))