我已将安全/净化的 HTML 保存在数据库表中。
如何在 Razor 视图中写出此 HTML 内容?
它总是将 <
之类的字符转义,并将 & 符号转义为 &
。
@Html.Raw()
假设您的内容位于名为 mystring
的字符串中...
您可以使用:
@Html.Raw(mystring)
或者,您可以将字符串转换为 HtmlString
或在模型中实现 IHtmlString
或直接内联并使用常规 @
的任何其他类型:
@{ var myHtmlString = new HtmlString(mystring);}
@myHtmlString
在 ASP.NET MVC 3 你应该这样做:
// Say you have a bit of HTML like this in your controller:
ViewBag.Stuff = "<li>Menu</li>"
// Then you can do this in your view:
@MvcHtmlString.Create(ViewBag.Stuff)
您可以使用
@{ WriteLiteral("html string"); }
Html.Raw()
在那里不起作用
有时使用原始 html 可能会很棘手。主要是因为 XSS 漏洞。如果这是一个问题,但您仍想使用原始 html,您可以对可怕的部分进行编码。
@Html.Raw("(<b>" + Html.Encode("<script>console.log('insert')</script>" + "Hello") + "</b>)")
结果是
(<b><script>console.log('insert')</script>Hello</b>)
您可以将字符串放入控制器中的视图数据中,如下所示:
ViewData["string"] = DBstring;
然后像这样在视图中调用该视图数据:
@Html.Raw(ViewData["string"].ToString())
除了按照 Dommer 的建议使用 @MvcHtmlString.Create(ViewBag.Stuff)
之外,我建议您也使用 AntiXSS 库作为建议的 phill http://haacked.com/archive/2010/04/06/using-antixss-as-the-default-encoder-for-asp-net.aspx
它编码了几乎所有可能的 XSS 攻击字符串。
在 RazorEngine 中使用模板函数的完整示例(例如,用于电子邮件生成):
@model SomeModel
@{
Func<PropertyChangeInfo, object> PropInfo =
@<tr class="property">
<td>
@item.PropertyName
</td>
<td class="value">
<small class="old">@item.OldValue</small>
<small class="new">@item.CurrentValue</small>
</td>
</tr>;
}
<body>
@{ WriteLiteral(PropInfo(new PropertyChangeInfo("p1", @Model.Id, 2)).ToString()); }
</body>
razor
语法的最新 MVC 3,并且Html.Raw
绝对可供我使用。