2012-01-27 42 views
44

pregunta embarazosamente novato:¿Cómo hacer Html.DisplayFor mostrar saltos de línea?

Tengo un campo string en mi modelo que contiene saltos de línea.

@Html.DisplayFor(x => x.MultiLineText) 

no muestra los saltos de línea.

Obviamente podría hacer algunas modificaciones en el modelo y crear otro campo que reemplace \n con <br/>, pero parece kludgy. ¿Cuál es la manera de hacer libros de texto para que esto funcione?

Respuesta

70

extensión A HtmlHelper método para visualizar los valores de cadena con saltos de línea:

public static MvcHtmlString DisplayWithBreaksFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression) 
{ 
    var metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData); 
    var model = html.Encode(metadata.Model).Replace("\r\n", "<br />\r\n"); 

    if (String.IsNullOrEmpty(model)) 
     return MvcHtmlString.Empty; 

    return MvcHtmlString.Create(model); 
} 

Y a continuación, puede utilizar la siguiente sintaxis:

@Html.DisplayWithBreaksFor(m => m.MultiLineField) 
+3

+1 solo porque me encantan los métodos de extensión útiles :) –

+1

+1: Manera muy limpia de lograr esto – chiccodoro

+1

¿Dónde puedo definirlo en MVC 4? – Ofiris

2

Intente utilizar
@Html.Raw("<p>" + Html.LabelFor(x => x.Name) + "</p>")

3

Se crea una plantilla de visualización de los datos. Aquí hay una publicación que detalla cómo hacerlo. How do I create a MVC Razor template for DisplayFor()

En esa plantilla usted hace la traducción real de líneas nuevas en
y cualquier otro trabajo que deba hacerse para la presentación.

+0

+1 a la idea de plantilla, pero contestar el crédito va a la ejecución real dada por @slapthelownote –

42

En su opinión, puede intentar algo así como

@Html.Raw(Html.Encode(Model.MultiLineText).Replace("\n", "<br />")) 
+4

debe ser al menos '.Colocar ("\ r \ n", ...)'. Además, la [solución de cwills] (http://stackoverflow.com/a/10290684/1343917) a continuación es mucho mejor, en mi opinión. –

+1

No \ n es realmente suficiente: el resto no dañará, ya que son espacios en blanco juste para html.Si bien la coincidencia en \ r \ n se perderá la nueva línea de estilo de Unix y no los manejará. –

+0

La mejor manera para mí. +1 –

4

La plantilla de visualización es probablemente la mejor solución, pero hay otra opción fácil de utilizar un asistente de HTML si sabes que estás simplemente mostrar una cadena, por ejemplo:

namespace Shaul.Web.Helpers 
{ 
    public static class HtmlHelpers 
    { 
     public static IHtmlString ReplaceBreaks(this HtmlHelper helper, string str) 
     { 
      return MvcHtmlString.Create(str.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.None).Aggregate((a, b) => a + "<br />" + b)); 
     } 
    } 
} 

Y entonces tendrá que utilizar se siente:

@using Shaul.Web.Helpers 

@Html.ReplaceBreaks(Model.MultiLineText) 
+0

+1 - Limpio, gracias! –

44

i recomienda formatear la salida con CSS en lugar de utilizar la CPU consume manipulación de cadenas laterales de servidor similares. reemplazar,

sólo tiene que añadir esta propiedad de estilo para representar textos de varias líneas:

.multiline 
{ 
    white-space: pre-wrap; 
} 

continuación

<div class="multiline"> 
    my 
    multiline 
    text 
</div> 

nuevas líneas rendirá como br elementos, probarlo aquí http://refork.com/xaf4

+5

Para mejorar esto para que 'Html.DisplayFor' aún se pueda usar, aplique' [System.ComponentModel.DataAnnotations.DataType (System.ComponentModel.DataAnnotations.DataType.MultilineText)] 'atribuye a la propiedad' MultiLineText' en el modelo y crea una plantilla DisplayTemplate con el contenido '@model cadena @Modelo ' – Mike

+3

Ojalá pudiera votar dos veces. – Winks

+5

Esta debería ser la respuesta aceptada. – Charlie

0

Aquí hay otra opción método de extensión.

public static IHtmlString DisplayFormattedFor<TModel>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, string>> expression) 
    { 
     string value = Convert.ToString(ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData).Model); 

     if (string.IsNullOrWhiteSpace(value)) 
     { 
      return MvcHtmlString.Empty; 
     } 

     value = string.Join("<br/>", value.Split(new[] { Environment.NewLine }, StringSplitOptions.None).Select(HttpUtility.HtmlEncode)); 

     return new HtmlString(value); 
    } 
Cuestiones relacionadas