在ASP.NET MVC Razor视图中用<br />替换换行符

bka*_*aid 234 asp.net-mvc razor asp.net-mvc-3

我有一个接受输入的textarea控件.我想稍后通过简单地使用以下方法将该文本呈现为视图:

@ Model.CommentText

这适当地编码任何值.但是,我想用换行换字符,<br />我找不到一种方法来确保新的br标签不被编码.我尝试过使用HtmlString,但还没有运气.

Jac*_*all 647

使用CSS空白属性而不是打开自己的XSS漏洞!

<span style="white-space: pre-line">@Model.CommentText</span>
Run Code Online (Sandbox Code Playgroud)

  • 实际上`white-space:pre-wrap;`更好,因为`pre-line`会通过将空格分组到一个空格来弄乱你的文本. (35认同)
  • @Jacob Krall - 我登录后只给你一个+1.神奇的小技巧. (8认同)
  • 不知道这个.绝对比我的答案更好. (7认同)
  • http://www.quirksmode.org/css/whitespace.html对'pre-line`有一个很好的解释(我只知道`nowrap`和`pre`). (6认同)
  • 不幸的是,这几乎不适用于任何电子邮件客户端(包括Office 2013). (4认同)
  • 这很棒.我不确定`<br />`是否真的是好的标记.我认为这取决于具体情况.如果你把<br />放在那里来修复布局,那就糟糕了.有时,换行符实际上是内容的一部分,就像在诗中一样.但即便如此:在*content*中添加换行符,而不是标记中的`<br />`,并使用`white-space:pre-line`. (2认同)
  • @ChtiwiMalek:我当然同意你通常想要保留所有的空格,但最初的问题是关于将换行符转换成`<br />`s (2认同)
  • 这种方法的一个警告是,由于浏览器错误,新行将在复制粘贴时丢失.请参阅https://bugzilla.mozilla.org/show_bug.cgi?id=1174452和https://code.google.com/p/chromium/issues/detail?id=317365 (2认同)

Oma*_*mar 115

请尝试以下方法:

@MvcHtmlString.Create(Model.CommentText.Replace(Environment.NewLine, "<br />"))
Run Code Online (Sandbox Code Playgroud)

更新:

根据marcind's有关评论此相关的问题时,ASP.NET MVC团队正在实施类似的东西<%:,并<%=为Razor视图引擎.

更新2:

我们可以将有关HTML编码的任何问题转化为有害用户输入的讨论,但已经存在足够的内容.

无论如何,要注意潜在的有害用户输入.

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

更新3(Asp.Net MVC 3):

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

  • 对于MVC 3的发布版本,建议似乎是@ Html.Raw(Html.Encode(Model.CommentText).Replace(Environment.NewLine,"<br />")),而不是使用MvcHtmlString.至少用于展示. (20认同)
  • 我的上帝啊,不.如果我决定对某些`<script>'发表评论怎么办? (13认同)
  • 谢谢 - 这很有效.非常接近,但必须过早或过晚地进行更换.我最终使用了这个:@ MvcHtmlString.Create(Html.Encode(Model.CommentText).Replace("\n","<br />"))因为Environment.NewLine无法正常工作. (4认同)
  • Environment.NewLine并不真正适用于表单帖子,因为浏览器通常只返回`\n`而不是`\ r \n` (2认同)
  • Environment.NewLine代表"\ r \n".如果我的用户使用linux或mac输入数据,则换行符只是"\n"或"\ r".是不是有某种方法考虑到这一点? (2认同)
  • 即使使用MVC3,这个解决方案看起来也很难看.这是相当长的,你必须看两次,以确保一切都编码正确,你有不同类型的换行问题.下面基于CSS的解决方案要好得多! (2认同)

the*_*lem 10

Omar作为HTML Helper的第三个解决方案是:

public static IHtmlString FormatNewLines(this HtmlHelper helper, string input)
{
    return helper.Raw(helper.Encode(input).Replace("\n", "<br />"));
}
Run Code Online (Sandbox Code Playgroud)


drz*_*aus 9

拆分换行符(环境不可知)并定期打印 - 无需担心编码或xss:

@if (!string.IsNullOrWhiteSpace(text)) 
{
    var lines = text.Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);
    foreach (var line in lines)
    {
        <p>@line</p>
    }
}
Run Code Online (Sandbox Code Playgroud)

(删除空条目是可选的)


Aka*_*oni 5

DRY 原则应用于 Omar 的解决方案,这是一个 HTML Helper 扩展:

using System.Web.Mvc;
using System.Text.RegularExpressions;

namespace System.Web.Mvc.Html {
    public static class MyHtmlHelpers {
        public static MvcHtmlString EncodedReplace(this HtmlHelper helper, string input, string pattern, string replacement) {
            return new MvcHtmlString(Regex.Replace(helper.Encode(input), pattern, replacement));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

用法(使用改进的正则表达式):

@Html.EncodedReplace(Model.CommentText, "[\n\r]+", "<br />")
Run Code Online (Sandbox Code Playgroud)

这还有一个额外的好处,即减少了 Razor View 开发人员在确保 XSS 漏洞的安全性方面的责任。


我对 Jacob 的解决方案的担忧是,使用 CSS 渲染换行符会破坏HTML 语义