4

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

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

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

4

5 回答 5

7

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

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

如果您使用的是剃刀视图,则不必正常调用 Html.Encode。默认情况下,Razor html 对所有输出进行编码。 来自 Scott Gu 的介绍 Razor 的博客

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

于 2011-07-21T20:31:18.063 回答
3

我同意@Roger 的评论——实际上没有必要对您完全控制的任何内容进行编码。

如果您仍然希望比抱歉更安全(这不是一件坏事),您可以使用Microsoft AntiXss 库并使用该.GetSafeHtmlFragment(input)方法 - 请参阅Anti-XSS 库中的 HTML 清理

例如

<%= AntiXss.GetSafeHtmlFragment(TempData["message"]) %>
于 2010-10-04T21:51:13.600 回答
3

仅供参考,Microsoft Web 保护库(AKA Microsoft AntiXSS 库)的开发人员似乎已经破坏了程序集并提取了所有以前工作的版本。在当前状态下,它不再是可行的解决方案。在阅读评论之前,我将其视为解决此问题的方法。最新版本的所有 18 个当前评级都是负面的,并抱怨它在没有开发人员更新的情况下被破坏,所以我什至没有尝试过。

因为我使用的是 Razor,所以我选择了 @ICodeForCoffee 的解决方案。这很简单,似乎工作得很好。我需要使用换行符进行可能冗长的描述并对其进行格式化,以便换行符会在页面中出现。

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

@MvcHtmlString.Create(Html.Encode(Model.Description).Replace(Environment.NewLine, "<br />"))
于 2012-08-24T21:58:00.377 回答
0

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

  1. HTMLEncode 消息
  2. 插入换行标签
  3. 将消息添加到 TempData 集合。
于 2010-10-04T20:27:08.387 回答
0

试试这个:

StringBuilder sb = new StringBuilder();

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

TempData["message"] = sb.ToString();
于 2010-10-04T20:37:54.640 回答