Html.Raw MVC助手如何工作?

时间:2016-01-30 18:42:01

标签: asp.net asp.net-mvc razor html-encode

我使用Html.Raw打印原始html内容,例如当我从控制器向视图端发送ViewBag.div = "<div> Hello </div>";之类的内容时,它不会打印原始html内容,除非我使用{{ 1}}方法但是如果我有一个编码内容,比如使用jquery编码并插入到数据库中的内容,并且我想将其打印为原始html内容,则Html.Raw方法不起作用,我必须使用{{ 1}}在我使用Html.Raw之前,请任何人解释为什么它以这种方式起作用以及使用HttpUtility.HtmlDecode(EncodedContent)方法的正确情况是什么?或者换句话说,为什么Html.Raw在接收html实体作为参数而不是html标签时不起作用?

2 个答案:

答案 0 :(得分:18)

因为编码字符是HTML,并且该字符串的Raw版本是编码字符。

Html.Raw在不进行任何html编码的情况下呈现给出的内容,因此使用@Html.Raw(ViewBag.div);

<div> Hello </div>

呈现

ViewBag.Something = "&gt;";

但是,当您在其中编码字符时,例如&gt;,其原始版本为Html.Raw(HttpUtility.HtmlDecode(EncodedContent));。要回到实际的html,您需要{{1}},因为您已经说过了。

如果Html.Raw确实进行了解码,那么它会让人感到困惑,我们需要一些没有做到的事情。 ; - )

答案 1 :(得分:2)

Html.Raw方法要求Razor引擎<​​strong> 不对特殊字符进行编码

Razor Engine对特殊字符进行编码,因为它认为您希望在发送给它的状态下显示它们,因此它会对特殊字符进行编码,浏览器会再次对它们进行解码,以便在原始状态下显示它们(您所处的状态)发送到剃刀引擎),但如果您使用Html.Raw ,这意味着您要求Razor引擎不对您内容的特殊字符进行编码,实际上这并不意味着您要求它解码您的编码内容,例如您从数据库获取的内容,它只是要求引擎 不对特殊字符进行编码 ,所以如果你有一个编码内容你必须使用HttpUtility.HtmlDecode对数据库进行解码,然后要求剃刀引擎不使用Html.Raw对返回的html标记进行编码。

如果您的数据库中包含此内容,则为eaxmple

&lt;h1&gt;dklxf;&lt;span style="font-style: italic;"&gt;kldk;dlk&lt;span style="font-weight: bold;"&gt;dxl'f;dlxd'fdlf;ldk;dlkf&lt;/span&gt;&lt;/span&gt;&lt;/h1&gt;

现在如果你在不使用HTML.Raw的情况下进行打印,剃刀引擎会对要在浏览器中打印的内容中的特殊字符进行编码,但是如果使用HTML.Raw则表示不这样做内容上的任何内容,以便浏览器将它们渲染为一组html标签,其中包含内容但不包含格式化数据,您将获得以下内容:

<h1>dklxf;<span style="font-style: italic;">kldk;dlk<span style="font-weight: bold;">dxl'f;dlxd'fdlf;ldk;dlkf</span></span></h1></p>

但是如果您使用Html.Raw(HttpUtility.HtmlDecode(EncodedContent)),那么您将在页面中获得格式化数据,如下面的内容,因为发送到浏览器的内容是html标签而非实体

dklxf;的 kldk; DLK的 DXL&#39; F; dlxd&#39; fdlf; LDK; dlkf