2009-02-07 17 views
23

Html.Encode parece que simplemente llama al HttpUtility.HtmlEncode para reemplazar unos pocos caracteres específicos html con sus secuencias de escape.ASP.NET MVC Html.Encode - Nuevas líneas

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 esa información en otra pantalla (usando Html.Encode), las líneas nuevas y el espaciado 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 que acaba de escribir un método estático que utiliza HtmlEncode, y luego reemplaza nuevas líneas en la cadena resultante con <br> y grupos de múltiples espacios con &nbsp;

Otra opción sería la de enredar con el white-space: pre atributo en mis hojas de estilo; sin embargo, no estoy seguro si esto produciría efectos secundarios cuando los métodos Html de ayuda incluyan 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 método alternativo 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?

Respuesta

23

HtmlEncode solo está destinado a codificar caracteres para su visualización en HTML. Específicamente, no codifica los caracteres de espacio en blanco.

Iría con su primera opción y la convertiría en un método de extensión para HtmlHelper. Algo así como:

public static string HtmlEncode(this HtmlHelper htmlHelper, 
           string text, 
           bool preserveWhitespace) 
{ 
    // ... 
} 

Usted podría utilizar String.Replace() para codificar los saltos de línea y espacios (o Regex.Replace si necesita una mejor adecuación).

2

Ponga su salida en <pre></pre> y/o <code></code> bloques. Por ejemplo:

<pre>@someValue</pre>/<code>@someValue</code> 

Usar el css equivalente en una div existente:

<div style="white-space:pre-wrap;">@someValue</div> 

depende de si desea que el marcado semántico o si desea jugar con CSS. Creo que estos son más claros que la inserción de etiquetas <br/>.

6

Utilizando el style="white-space:pre-wrap;" funcionó para mí. Por this article.

5

Si utiliza la maquinilla de afeitar que puede 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 controlador, pero debería funcionar de la misma manera .

+0

La parte del controlador no se compilará. – 1kevgriff

+0

No compila.debería ser: MvcHtmlString encoded = MvcHtmlString (HttpContext.Current.Server.HtmlEncode (Body) .Replace (Environment.NewLine, "
")); – AntonK

+0

"El tipo 'System.Web.HttpServerUtility' no tiene constructores definidos" use HttpUtility.HtmlEncode – Benoit

0
/// <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 />")); 
    } 
Cuestiones relacionadas