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

我有一个接受input的textarea控件。 我想稍后通过简单地使用以下内容将该文本呈现给视图:

@ Model.CommentText

这是正确的编码任何值。 但是,我想用<br />replace换行符,而且我找不到一种方法来确保新的br标签不被编码。 我曾尝试使用HtmlString,但还没有任何运气。

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

 <span style="white-space: pre-line">@Model.CommentText</span> 

尝试以下操作:

 @MvcHtmlString.Create(Model.CommentText.Replace(Environment.NewLine, "<br />")) 

更新:

根据marcind's对这个相关问题 marcind's评论,ASP.NET MVC团队正在寻求实现与Razor视图引擎的<%:<%=相似的东西。

更新2:

我们可以把关于HTML编码的任何问题变成关于有害用户input的讨论,但是已经存在足够多的问题。

无论如何,照顾可能有害的用户input。

 @MvcHtmlString.Create(Html.Encode(Model.CommentText).Replace(Environment.NewLine, "<br />")) 

更新3(Asp.Net MVC 3):

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

换行符(环境不可知)和定期打印 – 无需担心编码或xss:

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

(删除空条目是可选的)

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

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

在Omar的解决scheme中应用DRY原则 ,下面是一个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)); } } } 

用法(改进了正则expression式):

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

这也有利于减lessRazor View开发者的负担,以确保XSS漏洞的安全性。


我对Jacob的解决scheme的关注是,用CSS来渲染线条会破坏HTML语义 。

我需要将一些文本分成段落(“p”标签),所以我创build了一个简单的帮助,使用以前答案中的一些build议(谢谢你们)。

 public static MvcHtmlString ToParagraphs(this HtmlHelper html, string value) { value = html.Encode(value).Replace("\r", String.Empty); var arr = value.Split('\n').Where(a => a.Trim() != string.Empty); var htmlStr = "<p>" + String.Join("</p><p>", arr) + "</p>"; return MvcHtmlString.Create(htmlStr); } 

用法:

 @Html.ToParagraphs(Model.Comments)