Replace line break characters with <br /> in ASP.NET MVC Razor view
我有一个接受输入的文本区域控件。我试图稍后通过以下方法将该文本呈现到视图中:
@Model.CommentText
这是对任何值的正确编码。但是,我想用
使用CSS空白属性,而不是打开自己的XSS漏洞!
1 | <span style="white-space: pre-line">@Model.CommentText</span> |
请尝试以下操作:
1 | @MvcHtmlString.Create(Model.CommentText.Replace(Environment.NewLine,"<br />")) |
更新:
根据
我们可以将有关HTML编码的任何问题转化为对有害用户输入的讨论,但已经有足够多的问题存在了。
无论如何,要注意潜在的有害用户输入。
1 | @MvcHtmlString.Create(Html.Encode(Model.CommentText).Replace(Environment.NewLine,"<br />")) |
更新3(ASP.NET MVC 3):
1 2 | @Html.Raw(Html.Encode(Model.CommentText).Replace(" ","<br />")) |
作为HTML助手,OMAR的第三个解决方案是:
1 2 3 4 5 | public static IHtmlString FormatNewLines(this HtmlHelper helper, string input) { return helper.Raw(helper.Encode(input).Replace(" ","<br />")); } |
在换行(环境不可知)上拆分并定期打印--无需担心编码或XSS:
1 2 3 4 5 6 7 8 9 10 11 12 | @if (!string.IsNullOrWhiteSpace(text)) { var lines = text.Split(new[] { ' ', ' ' }, StringSplitOptions.RemoveEmptyEntries); foreach (var line in lines) { <p> @line </p> } } |
(可选择删除空条目)
我需要将一些文本分成段落("P"标记),所以我使用前面答案中的一些建议创建了一个简单的助手(谢谢大家)。
1 2 3 4 5 6 7 8 9 10 11 12 13 | public static MvcHtmlString ToParagraphs(this HtmlHelper html, string value) { value = html.Encode(value).Replace(" ", String.Empty); var arr = value.Split(' ').Where(a => a.Trim() != string.Empty); var htmlStr ="<p> " + String.Join(" </p><p> ", arr) +" </p>"; return MvcHtmlString.Create(htmlStr); } |
用途:
1 | @Html.ToParagraphs(Model.Comments) |
将dry原理应用到omar的解决方案中,下面是一个HTML助手扩展:
1 2 3 4 5 6 7 8 9 10 | 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)); } } } |
用法(使用改进的regex):
1 2 3 | @Html.EncodedReplace(Model.CommentText,"[ ]+","<br />") |
这还有一个额外的好处,即减少Razor View开发人员的责任,以确保XSS漏洞的安全性。
我对Jacob的解决方案的关注是,使用CSS呈现换行符会破坏HTML语义。