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

Sha*_*ica 49 razor asp.net-mvc-3

令人尴尬的新手问题:

string我的模型中有一个包含换行符的字段.

@Html.DisplayFor(x => x.MultiLineText)
Run Code Online (Sandbox Code Playgroud)

不显示换行符.

很显然,我可以做的模型的一些摆弄,并创建另一个字段替换\n<br/>,但似乎缺憾.什么是教科书使这项工作的方式?

cwi*_*lls 77

一个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);
}
Run Code Online (Sandbox Code Playgroud)

然后您可以使用以下语法:

@Html.DisplayWithBreaksFor(m => m.MultiLineField)
Run Code Online (Sandbox Code Playgroud)

  • 对于其他可能不知道的新手,在"public static class HtmlExtensions {<put the method here>}"中定义cwills的DisplayWithBreaksFor()方法. (5认同)
  • +1只是因为我喜欢有用的扩展方法:) (3认同)

Cht*_*lek 54

我建议用css格式化输出,而不是使用cpu消耗服务器端字符串操作,如.replace,

只需添加此样式属性即可呈现多行文本:

.multiline
{
   white-space: pre-wrap;
}
Run Code Online (Sandbox Code Playgroud)

然后

<div class="multiline">
  my
  multiline
  text
</div>
Run Code Online (Sandbox Code Playgroud)

行将呈现如下 br元素,在此处测试http://refork.com/xaf4

  • 为了改进这一点,仍然可以使用`Html.DisplayFor`将`[System.ComponentModel.DataAnnotations.DataType(System.ComponentModel.DataAnnotations.DataType.MultilineText)]`属性应用于模型上的`MultiLineText`属性.使用内容`@model string <span class ="multiline"> @ Model </ span>创建一个DisplayTemplate (5认同)

sla*_*ote 44

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

@Html.Raw(Html.Encode(Model.MultiLineText).Replace("\n", "<br />"))
Run Code Online (Sandbox Code Playgroud)

  • 应该至少是`.Replace("\ r \n",...)`.另外,在我看来,下面的[来自cwills的解决方案](http://stackoverflow.com/a/10290684/1343917)要好得多. (4认同)