c# asp.net-mvc newline html-encode

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 &nbsp;

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/> .