web-dev-qa-db-fra.com

Comment rendre Html.DisplayFor afficher les sauts de ligne?

Question embarrassante pour les débutants:

J'ai un champ string dans mon modèle qui contient des sauts de ligne. 

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

n'affiche pas les sauts de ligne.

Évidemment, je pourrais faire quelques manipulations dans le modèle et créer un autre champ qui remplace \n par <br/>, mais cela semble correct Quelle est la façon classique de faire ce travail?

46
Shaul Behr

Une méthode d'extension HtmlHelper pour afficher les valeurs de chaîne avec des sauts de ligne: 

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);
}

Et puis vous pouvez utiliser la syntaxe suivante:

@Html.DisplayWithBreaksFor(m => m.MultiLineField)
73
cwills

je recommande de formater la sortie avec css au lieu d'utiliser cpu qui consomme des chaînes de caractères côté serveur telles que .replace,

ajoutez simplement cette propriété de style pour rendre les textes multilignes:

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

puis

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

newlines rendra les éléments br, testez le ici http://refork.com/xaf4

48
Chtiwi Malek

À votre avis, vous pouvez essayer quelque chose comme

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

Le modèle d’affichage est probablement la meilleure solution, mais il existe une autre option simple d’utiliser un assistant HTML si vous savez que vous n’affichez qu’une chaîne, par exemple

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));
        }
    }
}

Et puis vous l'utiliseriez comme:

@using Shaul.Web.Helpers

@Html.ReplaceBreaks(Model.MultiLineText)
4
Ian Routledge

Vous créez un modèle d’affichage pour vos données . Voici un article expliquant comment procéder . Comment créer un modèle MVC Razor pour DisplayFor ()

Dans ce modèle, vous effectuez la traduction réelle des nouvelles lignes en 
et tout autre travail à faire pour la présentation.

3
linkerro

Voici une autre option de méthode d'extension.

    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);
    }
0
LawMan