编写/输出未转义的HTML字符串

461

我在数据库表中保存了安全/经过净化的HTML。

如何在Razor视图中将这个HTML内容写出?

它总是转义字符,如 < 和 ampersands 变成 &amp;


79
为了避免让人们阅读下面漫长的讨论历史 - @Html.Raw() - Chris S
为了避免像我这样的人在动态类型视图中使用匿名类型时出现问题,无法正常工作,请参考此答案以解决更具体的问题。尽管如果您的情况允许,使用强类型视图仍然是更好的选择。 - brichins
7个回答

688

假设您的内容存储在名为 mystring 的字符串中...

您可以使用以下代码:

@Html.Raw(mystring)

你也可以将字符串转换为 HtmlString 或其他实现了模型中的 IHtmlString 接口或直接内联使用普通的 @:

@{ var myHtmlString = new HtmlString(mystring);}
@myHtmlString

1
嗨Sergio。我正在使用MVC 3,并且我正在正确使用Raw方法。 - Gui
1
谢谢你的回答!我还在学习MVC 3,这个一直困扰着我。 - Todd Richardson
3
@Lorenzo,+1。我正在使用最新的MVC 3与“razor”语法,并且“Html.Raw”绝对可用于我。 - Chris Snowden
1
Lorenzo,我已经更新了答案,删除了提及 MVC Beta 的部分,因为那是几年前的事了。如果需要,可以随时恢复或更改。 - Alexei Levenkov
假设我在 Razor 中定义了一个全局变量,然后使用 @html.Raw() 对该变量进行操作,因为我想在其中定义一些标记并在视图上呈现。有没有办法让某人从 URL 中设置 Razor 变量的值?我只是想确保这不会通过 URL 注入受到 XSS 攻击。谢谢! - eaglei22
显示剩余4条评论

76
在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)

15
我更喜欢这种方法,因为如果传递的字符串为空,HTML.Raw会抛出异常。 - 37Stars
1
谢谢,这很简洁! - Hajjat

76

您可以使用

@{ WriteLiteral("html string"); }

5
对我来说,这很棒。我正在Hangfire应用程序中使用Razor发送电子邮件...... Html.Raw() 在那里无效。 - shanabus
1 用于 WriteLiteral - Muhammed Basil

11

有时候使用原始的 HTML 可能会比较棘手,主要是因为 XSS 漏洞的存在。如果这是一个问题,但你仍然想使用原始的 HTML,那么你可以对危险部分进行编码。

@Html.Raw("(<b>" + Html.Encode("<script>console.log('insert')</script>" + "Hello") + "</b>)")

结果在

(<b>&lt;script&gt;console.log('insert')&lt;/script&gt;Hello</b>)

5
您可以在控制器中将字符串放入ViewData中,方法如下:

 ViewData["string"] = DBstring;

然后在视图中像这样调用该视图数据:
@Html.Raw(ViewData["string"].ToString())

2

0

使用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>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接