我不确定处理此问题的最佳方法。在我的索引视图中,我显示TempData["message"]
中包含的消息。这允许我在来自另一个操作时向用户显示某些错误或信息性消息(例如,如果用户在没有访问权限时尝试输入编辑操作,则会将其踢回索引,并显示消息“您无权编辑此数据”。
在显示消息之前,我运行Html.Encode(TempData["message"])
。但是,我最近遇到的问题是,我希望能够通过换行符(<br>
)分隔出更长的消息。不幸的是(显然),<br>
由Html.Encode
编码,因此不会导致实际换行。
如何在Html编码字符串中正确处理换行符?
答案 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)
“处理”控制器中的消息:
答案 4 :(得分:0)
试试这个:
StringBuilder sb = new StringBuilder();
foreach(string message in messages)
{
sb.Append(string.Format("{0}<br />", Server.HtmlEncode(message));
}
TempData["message"] = sb.ToString();