【问题标题】:HTML.Encode but preserve line breaksHTML.Encode 但保留换行符
【发布时间】:2011-07-30 10:56:31
【问题描述】:

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

在我看来(剃刀)我想做这样的事情......

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

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

如果我这样做,我就会面临 XSS 问题。

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

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

【问题讨论】:

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


    【解决方案1】:

    在我的例子中,我的字符串包含我想要编码的 html,但我也希望 HTML 换行符保持原位。下面的代码将 HTML 换行符转换为 \n 然后对所有内容进行编码。然后它将所有 \n 实例重新转换为 HTML 换行符:

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

    【讨论】:

      【解决方案2】:

      对于那些使用 AntiXssEncoder.HtmlEncode 的人

      由于 AntiXssEncoder.HtmlEncode 将 /r/n 字符编码为&amp;#13;&amp;#10;,因此语句应为

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

        • 太棒了!一直在找这个。
        • 对于 asp.net 核心,我在进行替换时必须查找转义字符,因此下面会同时查找回车符和换行符@Html.Raw(Html.Encode(output).Replace("&amp;#xD;&amp;#xA;", "&lt;br/&gt;"))
        • 这对我不起作用。我用这个:@Html.Raw("Customer Name\nAddress".Replace("\n", "
          "))
        【解决方案4】:

        如果您发现自己多次使用它,将其包装在自定义 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 命名空间添加 using 才能使 HtmlHelper 可用。

        【讨论】:

        • 谢谢你,我喜欢 HtmlHelpers 和扩展方法;使得一些相当干净的使用。关于命名空间,我倾向于将我的助手放在 System.Web.Mvc 命名空间中。这样可以让我在整个应用程序中“始终可用”,从而省去了不断添加 using 语句的麻烦,并且由于我不必更改命名空间,因此可以更轻松地将我的帮助代码从一个项目复制到另一个项目。
        【解决方案5】:

        您可以对您的信息进行编码,然后将其显示为原始信息。比如:

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

        【讨论】:

          猜你喜欢
          • 2011-07-12
          • 1970-01-01
          • 2019-11-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-08-04
          • 1970-01-01
          相关资源
          最近更新 更多