用< br />替换换行符。

Replace line break characters with <br /> in ASP.NET MVC Razor view

我有一个接受输入的文本区域控件。我试图稍后通过以下方法将该文本呈现到视图中:

@Model.CommentText

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


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

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


请尝试以下操作:

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

更新:

根据marcind's对这一相关问题的评论,ASP.NET MVC团队希望为Razor View引擎实现类似于<%:<%=的功能。

更新2:

我们可以将有关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语义。