在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)