我使用Html.Raw打印原始html内容,例如当我从控制器向视图端发送ViewBag.div = "<div> Hello </div>";
之类的内容时,它不会打印原始html内容,除非我使用{{ 1}}方法但是如果我有一个编码内容,比如使用jquery编码并插入到数据库中的内容,并且我想将其打印为原始html内容,则Html.Raw
方法不起作用,我必须使用{{ 1}}在我使用Html.Raw
之前,请任何人解释为什么它以这种方式起作用以及使用HttpUtility.HtmlDecode(EncodedContent)
方法的正确情况是什么?或者换句话说,为什么Html.Raw
在接收html实体作为参数而不是html标签时不起作用?
答案 0 :(得分:18)
因为编码字符是HTML,并且该字符串的Raw版本是编码字符。
Html.Raw在不进行任何html编码的情况下呈现给出的内容,因此使用@Html.Raw(ViewBag.div);
:
<div> Hello </div>
呈现
ViewBag.Something = ">";
但是,当您在其中编码字符时,例如>
,其原始版本为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
<h1>dklxf;<span style="font-style: italic;">kldk;dlk<span style="font-weight: bold;">dxl'f;dlxd'fdlf;ldk;dlkf</span></span></h1>
现在如果你在不使用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标签而非实体