Html.Raw MVC 助手如何工作?

How does Html.Raw MVC helper work?

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

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


Html.Raw 在不进行任何 html 编码的情况下呈现给定的内容,因此 ViewBag.div = "<div> Hello </div>";:

@Html.Raw(ViewBag.div);

渲染

<div> Hello </div>

但是,当您在其中编码字符时,例如 ViewBag.Something = "&gt;";,其原始版本为 &gt;。要回到实际 html,您需要 Html.Raw(HttpUtility.HtmlDecode(EncodedContent)); 正如您所说。

如果 Html.Raw 确实进行了解码,那将会很混乱,我们需要一些不进行解码的东西。 ;-)

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

Razor 引擎对特殊字符进行编码,因为它认为您想以发送给它的状态显示它们,所以它对特殊字符进行编码,然后浏览器再次解码它们以显示它们的原始状态(状态你发送到 Razor 引擎),但是如果你使用 Html.Raw 这意味着你要求 Razor 引擎不要对你的内容的特殊字符进行编码,实际上这并不意味着你要求它解码你的编码内容 比如你从数据库中得到的内容,它只是要求引擎不要编码特殊字符 因此,如果您在数据库中有编码内容,则必须使用 HttpUtility.HtmlDecode 对其进行解码,然后要求剃刀引擎不要使用 Html.Raw 对返回的 html 标签进行编码.

例如,如果您的数据库中有此内容

&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 打印它,razor 引擎将对该内容中的特殊字符进行编码,以便按原样打印在浏览器中,但如果您使用 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;dlkdxl'f;dlxd'fdlf;ldk;dlkf