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 = "&amp;gt;";,其原始版本是&amp;gt;。如您所说,要返回实际的 html,您需要 Html.Raw(HttpUtility.HtmlDecode(EncodedContent));

如果 Html.Raw 确实进行了解码,那么它会令人困惑,我们需要一些没有这样做的东西。 ;-)

【讨论】:

【参考方案2】:

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

Razor 引擎对特殊字符进行编码,因为它认为您希望以您发送给它的状态显示它们,因此它对特殊字符进行编码,并且浏览器再次解码它们以显示它们的原始状态(您发送给它的状态)发送到 razor 引擎),但是如果您使用 Html.Raw ,这意味着您要求 Razor 引擎不对您内容的特殊字符进行编码,实际上这并不意味着您要求它解码您的编码content 这样您从数据库中获取的内容,它只是要求引擎不要对特殊字符进行编码,所以如果您在数据库中有编码的内容您必须使用 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 的情况下打印它,剃刀引擎将对该内容中的特殊字符进行编码,以便在浏览器中按原样打印,但如果您使用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 助手如何工作?的主要内容,如果未能解决你的问题,请参考以下文章

MVC html.raw 产生“处理您的请求时发生错误”

如何正确使用 Html.Raw(Json.Encode(Model))?

如何使用 Html 助手在 mvc 中显示密码隐藏字段

您将如何在 asp.net mvc 中实现面包屑助手?

如何将 knockout.js 与 ASP.NET MVC ViewModels 一起使用?

如何在 ASP.Net MVC 剃须刀助手中指定图像的虚拟路径