2011-02-17 42 views
26

我有一個textarea mvc。當輸入數據並將其顯示回給用戶時,如何顯示換行符?asp.net mvc轉換 n新行到html中斷

我像這樣顯示:

<%= Model.Description%> 
+0

它是如何顯示的? – smartcaveman

+0

在一行中。沒有'
'被創建。 –

+2

其實,這裏接受的答案提供了一個更好的實現: http://stackoverflow.com/questions/4220381/replace-line-break-characters-with-br-in-asp-net-mvc-razor-view – Nullius

回答

47

下面的類實現的HtmlHelper那正確編碼文本:

public static class HtmlExtensions 
{ 
    public static MvcHtmlString Nl2Br(this HtmlHelper htmlHelper, string text) 
    { 
     if (string.IsNullOrEmpty(text)) 
      return MvcHtmlString.Create(text); 
     else 
     { 
      StringBuilder builder = new StringBuilder(); 
      string[] lines = text.Split('\n'); 
      for (int i = 0; i < lines.Length; i++) 
      { 
       if (i > 0) 
        builder.Append("<br/>\n"); 
       builder.Append(HttpUtility.HtmlEncode(lines[i])); 
      } 
      return MvcHtmlString.Create(builder.ToString()); 
     } 
    } 
} 

它很容易在您的意見中使用:

<%= Html.Nl2Br(Model.MultilineText) %> 

或用剃刀:

@Html.Nl2Br(Model.MultilineText) 
+0

謝謝!正是我在找什麼! – LanFeusT

+14

這個HtmlExensions業務正是我一直在尋找的。但是,爲什麼不用'return MvcHtmlString.Create(HttpUtility.HtmlEncode(text).Replace(「\ n」,「
」))替換整個主體? – Chris

+0

+1:這真的節省了我的時間。 – horgh

0

也許這就是答案:How do you handle line breaks in HTML Encoded MVC view?

你可以試試:

Model.Description.Replace(Environment.NewLine, "<br/>"); 
+0

輸出未編碼的用戶輸入文字是非常危險的。儘管在原始問題中沒有使用編碼,但應該鼓勵編碼。 –

-1

它看起來並不像你」重新嘗試HTML編碼,以便正常替換應該可以正常工作。

<%= Model.Description.Replace(Environment.NewLine, "<br />")%> 
+1

輸出未經編碼的用戶輸入文本是非常危險的。儘管在原始問題中沒有使用編碼,但應該鼓勵編碼。 –

+0

你是對的大部分。我認爲這不是一個問題,因爲OP沒有編碼開始。 OP從未指定它是否是管理面板,或者它是匿名用戶輸入。如果它是某種只有管理員訪問權限的CMS系統(可能是少數情況),則不需要對其進行編碼。 –

6

嘗試是這樣的:

<%= 
Regex.Replace(
       Html.Encode(Model.Description), 
       Environment.NewLine, 
       "<br/>", 
       RegexOptions.IgnoreCase||RegexOptions.Multiline 
      ) 
%> 
+1

爲什麼這個獲得最多的選票?它是最高效還是最安全? –

+0

它可能有一些優勢是最古老的。 – patridge

+2

你不應該在這裏使用'Regex.Replace'。 – SLaks

9

顯示它回來時,在視圖中,以確保它是安全的,您應該始終編碼用戶輸入的文本

你可以做的Cyber​​nate建議或者可以把它

public static string EncodedMultiLineText(this HtmlHelper helper, string text) { 
    if (String.IsNullOrEmpty(text)) { 
    return String.Empty; 
    } 
    return Regex.Replace(helper.Encode(text), Environment.NewLine, "<br/>") 
} 

所以添加到的HtmlHelper擴展方法,它可以很容易地重新使用在您查看

<%= Html.EncodedMultiLineText(Model.Description) %> 
+2

您忘記了編碼。 – goenning

+2

抱歉,鼓勵在我的評論中編碼,然後在我自己的代碼中忽略它。失敗。 –

5

上面說的答案提供了一個靜態的HTML幫助擴展提供了一個過時的構造函數:

return new MvcHtmlString(builder.ToString()); 

這條線可以通過以下行來代替代碼:

return MvcHtmlString.Create((builder.ToString())); 
+0

發現這個例子的另一個問題。它打破空輸入。可以通過在方法的第一行插入以下代碼來修復:if(text == null)return MvcHtmlString.Create(text); –

+0

非常感謝。我從來不知道它會破裂。 –

+0

感謝您的投票。我現在可以添加評論,而不必將這些無聊的片段發佈爲答案。 –

0

這適用於我 -

<%= HttpUtility.HtmlDecode(Html.ActionLink( 「AOT < BR />要求#」, 「actionName」))%>

1

我喜歡使用HtmlExtensions ,Environment.NewLine和Regex,它們有不同的答案,所以我把上面的答案放到一個單一的方法中。

public static MvcHtmlString MultiLineText(this HtmlHelper htmlHelper, string text) { 
if (string.IsNullOrEmpty(text)) { 
    return MvcHtmlString.Create(string.Empty); 
} 
return MvcHtmlString.Create(Regex.Replace(HttpUtility.HtmlEncode(text), Environment.NewLine, "<br/>")); 
} 

使用

<%= Html.MultiLineText(Model.MultilineText) %> 

或者

@Html.MultiLineText(Model.MultilineText) 
0

對於Asp.net MVC剃刀,我用了Html.Encode阻止XSS攻擊

@Html.Raw(Html.Encode(Model.Description).Replace(Environment.NewLine, "<br />")) 
14

對於一個稍微不同的(和,恕我直言,更好和更安全)的方式g問題,請參閱this answer to a similar question

基本上,而不是通過將所有新行字符<br>元素的麻煩去,它是作爲應用下面的CSS的元素,用戶都出現了輸入的文本一樣簡單:

white-space: pre-line 
3

我認爲這answer以一個很好的方式解決了問題,只需使用css:style="white-space: pre-line"也請檢查:CSS white space property