ChatGPT解决这个技术问题 Extra ChatGPT

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

我已将安全/净化的 HTML 保存在数据库表中。

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

它总是将 < 之类的字符转义,并将 & 符号转义为 &amp;

为了节省人们在下面讨论的悠久历史 - @Html.Raw()
为了拯救像我这样尝试在动态类型视图中使用匿名类型的人,这不起作用 - 请参阅 this answer 到我的更具体的问题。尽管如果您的情况允许,将这种方法与强类型视图一起使用仍然会更好。

A
Alexei Levenkov

假设您的内容位于名为 mystring 的字符串中...

您可以使用:

@Html.Raw(mystring)

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

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

感谢您的回答。帮助我完成了我正在学习的一个小任务。 :) 但是我使用的是最新版本的 MVC3,到目前为止还没有 Html.Raw :(
嗨塞尔吉奥。我正在使用 MVC 3,并且我正在正确使用 Raw 方法。
谢谢你的回答!我仍在学习 MVC 3,这让我望而却步。
@Lorenzo,+1 我正在使用具有 razor 语法的最新 MVC 3,并且 Html.Raw 绝对可供我使用。
Lorenzo,我已经更新了答案,删除了几年前提到的 MVC Beta。随意恢复/更改。
T
Tom Chantler

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

我更喜欢这种方法,因为如果传递的字符串为空,HTML.Raw 就会爆炸。
谢谢,这个很干净!
A
Andrus

您可以使用

@{ WriteLiteral("html string"); }

这对我来说太棒了,在 Hangfire 应用程序中使用 Razor 发送电子邮件...Html.Raw() 在那里不起作用
用于 WriteLiteral
T
Travis J

有时使用原始 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>)

A
Ajay

您可以将字符串放入控制器中的视图数据中,如下所示:

 ViewData["string"] = DBstring;

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

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

I
Imad Alazani

除了按照 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 攻击字符串。


Z
ZlobnyiSerg

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