我有接受输入的一个textarea控制。我想以后渲染文本视图通过简单地使用:

  

@ Model.CommentText

此被适当地编码的任何值。不过,我想,以取代<br />的换行符,我不能找到一种方法,以确保新的BR标签不会被编码。我一直在使用HtmlString尝试,但还没有任何运气呢。

有帮助吗?

解决方案

使用 CSS空白属性的代替打开自己高达XSS漏洞!

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

其他提示

尝试以下方法:

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

更新

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

更新2:

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

总之,采取潜在有害的用户输入的护理。

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

更新3(Asp.Net MVC 3):

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

奥马的第三溶液作为HTML辅助将是:

public static IHtmlString FormatNewLines(this HtmlHelper helper, string input)
{
    return helper.Raw(helper.Encode(input).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>
    }
}

(删除空条目是可选的)

运用 DRY原则以奥马尔的解决方案,这里是一个HTML辅助扩展:

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));
        }
    }
}

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

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

这也有把较少责任在剃刀视图显影剂,以确保从XSS弱点安全的附加益处。


我与雅各的解决方案关注的是呈现与CSS断 HTML语义换行符。

我需要打破一些文本段落(“P”标签),所以我用一些在以前的答案的建议创建了一个简单的辅助(谢谢你们)。

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)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top