c# - ASP.NET MVC Html.Encode-Nuevas líneas
asp.net-mvc newline (5)
/// <summary>
/// Returns html string with new lines as br tags
/// </summary>
public static MvcHtmlString ConvertNewLinesToBr<TModel>(this HtmlHelper<TModel> html, string text)
{
return new MvcHtmlString(html.Encode(text).Replace(Environment.NewLine, "<br />"));
}
Html.Encode
parece simplemente llamar a HttpUtility.HtmlEncode
para reemplazar algunos caracteres específicos html con sus secuencias de escape.
Sin embargo, esto no proporciona ninguna consideración sobre cómo se interpretarán las líneas nuevas y los espacios múltiples (espacio en blanco de marcado). Así que proporciono un área de texto para que el usuario ingrese un bloque de información de texto sin formato, y luego muestre esos datos en otra pantalla (usando Html.Encode
), las nuevas líneas y el espacio no se conservarán.
Creo que hay 2 opciones, pero tal vez haya una tercera mejor que alguien pueda sugerir.
Una opción sería simplemente escribir un método estático que use HtmlEncode, y luego reemplazará las nuevas líneas en la cadena resultante con <br>
y grupos de espacios múltiples con
Otra opción sería meterse con el atributo white-space: pre
en mis hojas de estilo; sin embargo, no estoy seguro si esto produciría efectos secundarios cuando los métodos Html helper incluyen nuevas líneas y tabulaciones para hacer que la fuente de la página sea bonita.
¿Existe una tercera opción, como un indicador global, un evento o una anulación de método que pueda usar para cambiar la forma en que se realiza la codificación html sin tener que volver a hacer los métodos html helper?
HtmlEncode
solo está destinado a codificar caracteres para su visualización en HTML. Específicamente, no codifica los caracteres de espacio en blanco.
Me gustaría ir con su primera opción y convertirla en un método de extensión para HtmlHelper. Algo como:
public static string HtmlEncode(this HtmlHelper htmlHelper,
string text,
bool preserveWhitespace)
{
// ...
}
Puede usar String.Replace()
para codificar las nuevas líneas y espacios (o Regex.Replace
si necesita una mejor coincidencia).
Usando el style="white-space:pre-wrap;"
trabajó para mi. Por este artículo
Si usas Razor puedes hacer:
@MvcHtmlString.Create(Html.Encode(strToEncode).Replace(Environment.NewLine, "<br />"))
en su opinión, o en su controlador:
HttpServerUtility httpUtil = new HttpServerUtility();
MvcHtmlString encoded = httpUtil.HtmlEncode(strToEncode).Replace(Environment.NewLine, "<br />");
No he probado el método del controlador, pero debería funcionar de la misma manera.
Coloque su salida dentro de los bloques <pre></pre>
y / o <code></code>
. P.ej:
<pre>@someValue</pre> / <code>@someValue</code>
Usa el css equivalente en un div
existente:
<div style="white-space:pre-wrap;">@someValue</div>
Depende si quieres el marcado semántico o si quieres jugar con css. Creo que estas son más claras que insertar etiquetas <br/>
.