2012-01-27 522 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); 
    } 
相關問題