2012-01-27 136 views
44

令人尴尬的新手问题:如何使Html.DisplayFor显示换行符?

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

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

不显示换行符。

很显然,我可以在模型中做一些摆弄,并创建另一个字段,用<br/>替换\n,但看起来很烂。教科书的工作方式是什么?

回答

70

一个扩展的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) 
+3

+1只是因为我喜欢有用的扩展方法:) – 2012-04-24 07:28:33

+1

+1:非常干净的方式来实现这个 – chiccodoro 2012-10-31 08:32:24

+1

我可以在MVC 4中定义它吗? – Ofiris 2013-06-04 06:41:32

2

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

3

您为您的数据显示模板尝试。 这里有一篇文章详细说明如何做到这一点。 How do I create a MVC Razor template for DisplayFor()

在该模板中,您可以将换行符实际转换为
,以及其他任何需要进行演示的工作。

+0

+1为模板的想法,但回答要归功于由@slapthelownote – 2012-01-27 10:06:52

42

在你看来,你可以尝试像

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

给出的实际实施应该至少'.Replace( “\ r \ n”,...)'。另外,在我看来,下面的[来自cwills的解决方案](http://stackoverflow.com/a/10290684/1343917)要好得多。 – 2013-12-31 14:37:42

+1

没有\ n是真的够了:剩余\ r不会伤害,因为它们对于html来说是合理的空格。在\ r \ n上匹配时会错过unix样式的换行符,并且不会处理它们。 – 2014-03-18 14:45:16

+0

最适合我的方式。 +1 – 2015-06-10 12:34:30

4

显示模板可能是最好的解决方案,但有,如果你知道你只是显示一个字符串使用HTML帮助的另一个容易的选择,例如:

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) 
+0

+1 - 整洁,谢谢! – 2012-01-27 12:51:16

44

我建议格式化与CSS的输出,而不是使用消耗CPU的服务器端的字符串操作等。更换

只需添加此样式属性来呈现多文本:

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

然后

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

换行符将呈现像BR元素,在这里测试http://refork.com/xaf4

+5

为了改进这个,使'Html.DisplayFor'仍然可以应用' [System.ComponentModel.DataAnnotations.DataType(System.ComponentModel.DataAnnotations.DataType.MultilineText)]'属性添加到模型中的'MultiLineText'属性,并创建一个DisplayTemplate,其内容为@model string @Model' – Mike 2013-09-26 13:27:56

+3

我希望我可以upvote两次。 – Winks 2013-10-10 08:55:22

+5

这应该是被接受的答案。 – Charlie 2014-03-01 22:17:43

0

这里的另一个扩展方法选择。

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