Html.Raw MVC 助手如何工作?
Posted
技术标签:
【中文标题】Html.Raw MVC 助手如何工作?【英文标题】:How does Html.Raw MVC helper work? 【发布时间】:2016-05-08 10:21:42 【问题描述】:我使用 html.Raw 打印原始 html 内容,例如,当我从控制器向视图端发送诸如 ViewBag.div = "<div> Hello </div>";
之类的内容时,除非我使用 Html.Raw
方法,否则它不会打印原始 html 内容但是如果我有一个编码内容,比如使用 jquery 编码并插入数据库的内容,并且我想将其打印为原始 html 内容,Html.Raw
方法不起作用,我必须在使用 @987654325 之前使用HttpUtility.HtmlDecode(EncodedContent)
@所以请任何人解释它为什么以这种方式运行以及使用Html.Raw
方法的正确情况是什么?或者换一种说法,为什么Html.Raw
在接收html实体作为参数而不是html标签时不起作用?。
【问题讨论】:
【参考方案1】:因为编码字符是 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 确实进行了解码,那么它会令人困惑,我们需要一些没有这样做的东西。 ;-)
【讨论】:
【参考方案2】:Html.Raw
方法要求 Razor 引擎不对特殊字符进行编码。
Razor 引擎对特殊字符进行编码,因为它认为您希望以您发送给它的状态显示它们,因此它对特殊字符进行编码,并且浏览器再次解码它们以显示它们的原始状态(您发送给它的状态)发送到 razor 引擎),但是如果您使用 Html.Raw
,这意味着您要求 Razor 引擎不对您内容的特殊字符进行编码,实际上这并不意味着您要求它解码您的编码content 这样您从数据库中获取的内容,它只是要求引擎不要对特殊字符进行编码,所以如果您在数据库中有编码的内容您必须使用 HttpUtility.HtmlDecode 对其进行解码,然后要求剃须刀引擎不要使用 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>
现在,如果您在不使用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;dlkdxl'f;dlxd'fdlf;ldk;dlkf
【讨论】:
以上是关于Html.Raw MVC 助手如何工作?的主要内容,如果未能解决你的问题,请参考以下文章
如何正确使用 Html.Raw(Json.Encode(Model))?