HTML.Encode但保留换行符

时间:2011-04-06 01:36:35

标签: asp.net-mvc asp.net-mvc-3 html-encode

我将用户输入带入文本区域,存储并最终将其显示回用户。

在我的视图(Razor)中,我想做这样的事情......

@Message.Replace("\n", "</br>")

这不起作用,因为默认情况下Razor Html编码。这很棒,但我想换线。

如果我这样做,我就会遇到XSS问题。

@Html.Raw(Message.Replace("\n", "</br>"))

处理这种情况的正确方法是什么?

5 个答案:

答案 0 :(得分:44)

使用HttpUtility.HtmlEncode然后进行替换。

@Html.Raw(HttpUtility.HtmlEncode(Message).Replace("\n", "<br/>"))

答案 1 :(得分:13)

如果你发现自己不止一次使用它,将它包装在这样的自定义HtmlHelper中可能会有所帮助:

namespace Helpers
{
    public static class ExtensionMethods
    {
        public static IHtmlString PreserveNewLines(this HtmlHelper htmlHelper, string message)
        {
            return message == null ? null : htmlHelper.Raw(htmlHelper.Encode(message).Replace("\n", "<br/>"));
        }
    }
}

然后,您就可以像这样使用自定义HtmlHelper:

@Html.PreserveNewLines(Message)

请注意,您需要在Helpers名称空间中添加一个使用,以便HtmlHelper可用。

答案 2 :(得分:9)

您可以对邮件进行编码,然后以原始方式显示。类似的东西:

@Html.Raw(Server.HtmlEncode(Message).Replace("\n", "<br/>"))

答案 3 :(得分:1)

对于那些使用AntiXssEncoder.HtmlEncode

的人

由于AntiXssEncoder.HtmlEncode将/ r / n字符编码为&#13;&#10;所以语句应为

_mDraftMsgModel.wnItem.Description = AntiXssEncoder.HtmlEncode(draftModel.txtMsgContent, false).Replace("&#13;&#10;", "<br/>");

答案 4 :(得分:0)

在我的情况下,我的字符串包含要编码的html,但我也希望HTML换行符保持不变。下面的代码将HTML行换成\ n,然后对所有内容进行编码。然后,它会将\ n的所有实例恢复为HTML换行符:

@Html.Raw(HttpUtility.HtmlEncode(message.Replace("<br/>", "\n").Replace("<br />", "\n")).Replace("\n", "<br/>"))