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?
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)
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
À votre avis, vous pouvez essayer quelque chose comme
@Html.Raw(Html.Encode(Model.MultiLineText).Replace("\n", "<br />"))
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)
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.
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);
}