我有一个接受输入的textarea控件。我试图稍后通过简单地使用将文本渲染到视图:

@ model。CommentText

这是对任何值的正确编码。但是,我想用<br />替换换行字符,我找不到一种方法来确保新的br标记不会被编码。我已经尝试使用HtmlString,但还没有任何运气。


当前回答

在换行符上拆分(环境不确定)并定期打印—无需担心编码或xss:

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

(删除空条目是可选的)

其他回答

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

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

我需要将一些文本分解成段落(“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)

试试下面的方法:

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

更新:

根据马辛德对这一相关问题的评论,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 />"))

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

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

在换行符上拆分(环境不确定)并定期打印—无需担心编码或xss:

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

(删除空条目是可选的)