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

时间:2010-10-04 20:19:44

标签: asp.net-mvc html-encode

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

在显示消息之前,我运行Html.Encode(TempData["message"])。但是,我最近遇到的问题是,我希望能够通过换行符(<br>)分隔出更长的消息。不幸的是(显然),<br>Html.Encode编码,因此不会导致实际换行。

如何在Html编码字符串中正确处理换行符?

5 个答案:

答案 0 :(得分:7)

我见过的最简单的解决方案是:

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

如果您使用剃刀视图,则不必正常调用Html.Encode。默认情况下,Razor html会对所有输出进行编码。 From Scott Gu's blog introducing Razor

  

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

答案 1 :(得分:3)

我同意@Roger的评论 - 没有必要编码任何你完全可以控制的东西。

如果您仍然希望保持安全而不是抱歉(这不是一件坏事),您可以使用Microsoft AntiXss library并使用.GetSafeHtmlFragment(input)方法 - 请参阅HTML Sanitization in Anti-XSS Library

e.g。

<%= AntiXss.GetSafeHtmlFragment(TempData["message"]) %>

答案 2 :(得分:3)

仅供参考,Microsoft Web Protection Library(A.K.A.Microsoft AntiXSS Library)开发人员似乎打破了程序集并取消了所有以前正在运行的版本。它不再是目前状态下的可行解决方案。在阅读评论之前,我正在将其视为此问题的解决方案。最新发布的所有18个当前评级都是负面的,并且抱怨它被破坏而没有来自开发者的更新,所以我甚至没有尝试过。

自从我使用Razor以来,我选择了@ ICodeForCoffee的解决方案。它很简单,似乎工作得很好。我需要使用换行符进行可能冗长的描述并对其进行格式化,以便在页面中显示换行符。

为了完整起见,这里是我使用的代码,其中@ ICodeForCoffee的代码被修改为使用视图模型的描述字段:

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

答案 3 :(得分:0)

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

  1. HTMLEncode the message
  2. 插入换行符标记
  3. 向TempData集合添加消息。

答案 4 :(得分:0)

试试这个:

StringBuilder sb = new StringBuilder();

foreach(string message in messages)
{
sb.Append(string.Format("{0}<br />", Server.HtmlEncode(message));
}

TempData["message"] = sb.ToString();