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


436

我已经将安全/经过消毒的HTML保存在数据库表中。

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

它总是逃脱像<和连字符的字符&amp;


76
为了挽救人们的悠久历史,下面是他们的讨论@Html.Raw()
克里斯S

为了避免像我这样的人尝试在动态类型的视图中使用匿名类型来做到这一点,在这种情况下这种方法将行不通-请参阅我更具体的问题的答案。如果情况允许,将这种方法与强类型视图一起使用仍会更好。
brichins 2015年

Answers:


653

假设您的内容在名为mystring...

您可以使用:

@Html.Raw(mystring)

另外,您可以将您的字符串转换为model或直接内联HtmlString实现的任何其他类型,IHtmlString或者使用常规@

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

感谢您的回答。帮助我完成了正在学习的小任务。:)但是,我使用的是最新版本的MVC3,到目前为止还没有Html.Raw :(

1
嗨,塞尔吉奥。我正在使用MVC 3,并且正确使用了Raw方法。

1
谢谢您的回答!我仍在学习MVC 3,这使我难以理解。
Todd Richardson

3
@ Lorenzo,+ 1我正在使用具有razor语法的最新MVC 3,并且Html.Raw绝对可以使用。
克里斯·斯诺登

1
洛伦佐(Lorenzo),我更新了答案,删除了几年前提到的MVC Beta。随时还原/更改。
Alexei Levenkov 2015年

75

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

13
我更喜欢这种方法,因为如果传递的字符串为null,HTML.Raw会爆炸。
37颗星,2011年

1
谢谢,这很干净!
哈贾特2015年


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

4

您可以像这样将字符串放入控制器的viewdata中:

 ViewData["string"] = DBstring;

然后像这样在视图中调用该viewdata:

@Html.Raw(ViewData["string"].ToString())


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>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.