如何使Html.DisplayFor显示换行符?

尴尬的新手问题:

我的模型中包含换行符的string字段。

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

不显示换行符。

很明显,我可以在模型中做一些摆弄,并创造另一个取代\n领域,但看起来很烂。 什么是教科书的方式来使这项工作?

使用换行符显示string值的HtmlHelper扩展方法:

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

然后你可以使用下面的语法:

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

我build议使用css格式化输出,而不是使用CPU消耗服务器端string操作像.replace,

只需添加这个样式属性来渲染多行文本:

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

然后

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

换行符将呈现像br元素,请在http://refork.com/xaf4上进行testing

在你看来,你可以尝试类似的东西

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

显示模板可能是最好的解决scheme,但是如果你知道你只是显示一个string,还有另外一个简单的方法来使用html helper,例如:

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

然后你会使用它:

 @using Shaul.Web.Helpers @Html.ReplaceBreaks(Model.MultiLineText) 

您为您的数据创build一个显示模板。 这里有一篇文章,详细介绍如何做到这一点。 如何为DisplayFor()创build一个MVC Razor模板

在那个模板中,你可以将新行的实际转换成
以及其他需要做的工作。

尝试使用
@Html.Raw("<p>" + Html.LabelFor(x => x.Name) + "</p>")

这是另一个扩展方法选项。

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