Vergonzosamente novato pregunta:

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

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

no mostrar los saltos de línea.

Obviamente, yo podría hacer algo de trasteo en el modelo y crear otro campo que sustituye \n con <br/>, pero que parece desacoplados. ¿Cuál es el libro de texto de manera de hacer este trabajo?

InformationsquelleAutor Shaul Behr | 2012-01-27

7 Comentarios

  1. 77

    Un HtmlHelper método de extensión para mostrar 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 sintaxis siguiente:

    @Html.DisplayWithBreaksFor(m => m.MultiLineField)
    • +1 solo porque me encanta útiles los métodos de extensión 🙂
    • +1: Muy limpio manera de lograr esto
    • Donde puedo definir en MVC 4 ?
    • Bueno, pero en lugar de devolver MvcHtmlString.Empty cuando el valor es nulo o vacío me gustaría invocar la norma HtmlHelper.DisplayFor método para que cualquier NullDisplayText decoración puede ser utilizado.
    • Para otros newbs que no saben, definir cwills’ DisplayWithBreaksFor() método dentro de «public static de la clase HtmlExtensions { <puesto que el método aquí> }»
  2. 53

    recomiendo el formato de la salida con css en lugar de la utilización de cpu que consume el lado del servidor cadenas de manipulación gusta .reemplazar,

    sólo tiene que añadir esta propiedad de estilo para procesar textos multilínea :

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

    luego

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

    saltos de línea se representará como br elementos de prueba aquí http://refork.com/xaf4

    • Para mejorar en esto así que Html.DisplayFor todavía puede ser utilizado aplicar la [System.ComponentModel.DataAnnotations.DataType(System.ComponentModel.DataAnnotations.DataType.MultilineText)] atributo a la MultiLineText propiedad en el modelo y crear un DisplayTemplate con el contenido @model string <span class="multiline">@Model</span>
    • Me gustaría poder upvote dos veces.
    • Esto debe ser aceptado respuesta.
    • Excelente respuesta…
    • Es probable que no importa nada más, pero esto no funciona en IE9 y por debajo de
  3. 44

    En su opinión, puede intentar algo como

    @Html.Raw(Html.Encode(Model.MultiLineText).Replace("\n", "<br />"))
    • debe ser de al menos .Replace("\r\n", ...). También, el solución de cwills a continuación es mucho mejor, en mi opinión.
    • No \n es realmente suficiente : restante \r no le hará daño, ya que son juste espacios en blanco para html. Mientras que coinciden en \r\n se pierda el estilo unix nueva línea y no se ocupará de ellos.
    • La mejor manera para mí. +1
    • No sé si fue porque yo estoy usando ViewData en lugar de una propiedad normal, pero en ASP.NET Núcleo de Afeitar, he tenido que utilizar @Html.Raw(((string)ViewData["MyText"]).Replace("\n", "<br />"))
  4. 4

    La pantalla de la plantilla es probablemente la mejor solución, pero hay otra opción fácil de usar html helper si usted sabe que usted está a solo 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, a continuación, usted utilizaría como:

    @using Shaul.Web.Helpers
    
    @Html.ReplaceBreaks(Model.MultiLineText)
    • +1 Buena, gracias!
  5. 3

    De crear un modelo de visualización de datos.
    He aquí un post detallando cómo hacerlo.
    ¿Cómo puedo crear un MVC Razor plantilla para DisplayFor()

    En que la plantilla que haga la traducción de saltos de línea en
    y cualquier otro tipo de trabajo necesita ser hecho para la presentación.

    • +1 para la plantilla de la idea, sino que la respuesta de crédito va a la implementación real dada por @slapthelownote
  6. 1

    Aquí hay otro método de extensión opció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);
        }

Dejar respuesta

Please enter your comment!
Please enter your name here