代码之家  ›  专栏  ›  技术社区  ›  KallDrexx

如何处理HTML编码的MVC视图中的换行符?

  •  4
  • KallDrexx  · 技术社区  · 15 年前

    我不确定处理这件事的最佳方法。在我的索引视图中,我显示包含在 TempData["message"] . 这允许我在来自其他操作时向用户显示某些错误或信息性消息(例如,如果用户在没有访问权限的情况下尝试输入编辑操作,则会将其返回到索引,并显示一条消息“您无权编辑此数据”)。

    在显示消息之前,我运行 Html.Encode(TempData["message"]) . 但是,我最近遇到了这样一个问题:对于较长的消息,我希望能够通过换行符将行分隔开。( <br> )不幸的是(很明显),在 <BR> 被编码 Html.Encode 所以不会造成实际的断线。

    如何正确处理HTML编码字符串中的换行符?

    5 回复  |  直到 10 年前
        1
  •  3
  •   Mathieu    13 年前

    我同意@roger的意见-您完全可以控制的任何东西都不需要编码。

    如果你仍然希望比对不起更安全(这不是坏事),你可以使用 Microsoft AntiXss library 并使用 .GetSafeHtmlFragment(input) 方法见 HTML Sanitization in Anti-XSS Library

    例如

    <%= AntiXss.GetSafeHtmlFragment(TempData["message"]) %>
    
        2
  •  7
  •   CodingYourLife    13 年前

    我看到的最简单的解决方案是:

    @MvcHtmlString.Create(Html.Encode(TempData["message"]).Replace(Environment.NewLine, "<br />"))
    

    如果您使用的是Razor视图,则不必正常调用html.encode。默认情况下,Razor HTML对所有输出进行编码。 From Scott Gu's blog introducing Razor :

    默认情况下,使用@block发出的内容会自动进行HTML编码,以更好地抵御XSS攻击场景。

        3
  •  3
  •   TheUO    14 年前

    仅供参考,Microsoft Web保护库(又称Microsoft Antixss库)的开发人员似乎已经破坏了该程序集,并删除了所有以前运行的版本。在当前状态下,它不再是一个可行的解决方案。在阅读评论之前,我把它看作是这个问题的解决方案。目前对最新版本的所有18个评分都是负面的,并且抱怨它在没有开发人员更新的情况下被破坏,所以我甚至没有尝试过。

    我用了@icodeforcoffee的解决方案,因为我用的是剃刀。它很简单,而且似乎工作得很好。我需要用换行符记录可能很长的描述,并对它们进行格式化,以便换行符在页面中出现。

    为了完整起见,我使用的代码是@icodeforcoffee的代码,它被修改为使用视图模型的描述字段:

    @MvcHtmlString.Create(Html.Encode(Model.Description).Replace(Environment.NewLine, "<br />"))
    
        4
  •  0
  •   Dave Swersky    15 年前

    “处理”控制器中的消息:

    1. HTMLEncode消息
    2. 插入换行标记
    3. 将消息添加到tempdata集合。
        5
  •  0
  •   Pablo Claus Venkata K. C. Tata    14 年前

    试试这个:

    StringBuilder sb = new StringBuilder();
    
    foreach(string message in messages)
    {
    sb.Append(string.Format("{0}<br />", Server.HtmlEncode(message));
    }
    
    TempData["message"] = sb.ToString();