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