asp.net mvc转换\n新行到html中断

Sha*_*ean 29 asp.net-mvc asp.net-mvc-2

我有一个textareamvc.当输入数据并将其显示给用户时,如何显示换行符?

我这样显示:

<%= Model.Description%>
Run Code Online (Sandbox Code Playgroud)

Cod*_*odo 51

以下类实现了正确编码文本的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());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

它在您的视图中很容易使用:

<%= Html.Nl2Br(Model.MultilineText) %>
Run Code Online (Sandbox Code Playgroud)

或者用剃刀:

@Html.Nl2Br(Model.MultilineText)
Run Code Online (Sandbox Code Playgroud)

  • 这个HtmlExensions业务正是我想要的.但是,为什么不用`return MvcHtmlString.Create(HttpUtility.HtmlEncode(text).Replace("\n","<br />"))替换整个身体;`? (15认同)
  • 请显示所有导入/包含,因为默认情况下 MvcHtmlString 不存在。 (2认同)

mka*_*aja 20

对于稍微不同(以及恕我直言,更好,更安全)解决问题的方法,请参阅类似问题的答案.

基本上,不是将所有新行字符转换为<br>元素的麻烦,而是将以下CSS应用于显示输入文本的元素:

white-space: pre-line
Run Code Online (Sandbox Code Playgroud)

  • 我可能是唯一遇到这个问题的白痴,但为了节省下一个人的时间:如果你这样做,请确保删除 div 中所有无关的换行符。 (2认同)

Dav*_*enn 9

在视图中将其显示回来时,您应始终对用户输入的文本进行编码,以确保其安全.

你可以像Cyber​​nate建议的那样做,也可以将它添加到HtmlHelper扩展方法中

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/>")
}
Run Code Online (Sandbox Code Playgroud)

这样它就可以在你的视图中轻松重用

<%= Html.EncodedMultiLineText(Model.Description) %>
Run Code Online (Sandbox Code Playgroud)

  • 抱歉在我的评论中鼓励编码,然后在我自己的代码中将其遗漏.失败. (2认同)

Cha*_*ndu 6

尝试这样的事情:

<%=
Regex.Replace(
              Html.Encode(Model.Description), 
              Environment.NewLine, 
              "<br/>", 
              RegexOptions.IgnoreCase||RegexOptions.Multiline
             )
%>
Run Code Online (Sandbox Code Playgroud)

  • 你不应该在这里使用`Regex.Replace`. (2认同)

İbr*_*lük 6

对于 Asp.net mvc razor,我使用 Html.Encode 来阻止 xss 攻击

@Html.Raw(Html.Encode(Model.Description).Replace(Environment.NewLine, "<br />"))
Run Code Online (Sandbox Code Playgroud)


Rol*_*aer 5

上面提供静态HTML帮助扩展的答案提供了一个过时的构造函数:

return new MvcHtmlString(builder.ToString());
Run Code Online (Sandbox Code Playgroud)

此行可以由以下代码行替换:

return MvcHtmlString.Create((builder.ToString()));
Run Code Online (Sandbox Code Playgroud)