【问题标题】:ASP.NET MVC Passing Raw HTML from Controller to ViewASP.NET MVC 将原始 HTML 从控制器传递到视图
【发布时间】:2012-08-15 13:00:56
【问题描述】:

这几天我一直在摸不着头脑,我不确定这是我的环境问题还是基于 ASP.NET MVC 的代码本身的问题(尽管我在这方面有 5 年的经验) C#)。我正在使用最新的 Win7x64 和 VS 2008 以及所有补丁的全新安装。

我将原始 HTML 存储在数据库表中,控制器根据一些我无法控制的规则有选择地加载该表。不幸的是,当尝试将值填充到控件中的视图数据中时:

ViewData["HTMLData"] = DAO.HTMLDataGet();

当我看到输出时,它是转义/HTML 编码的。我尝试使用以下所有方法似乎都无法解决此问题:

<%: HttpUtility.HtmlDecode(ViewData["HTMLData"].ToString())%>

还有……

<%: Server.HtmlDecode(ViewData["HTMLData"].ToString())%>

还有……

<%: Html.Raw(ViewData["HTMLData"].ToString())%>

...它可以很好地从数据库表中获取原始 HTML,但是无论我尝试什么,它都会继续强制执行该爆破编码。从我在 MSDN 上阅读的内容来看,有一个脚注是关于由于 HTML 未正确解码而导致的问题,其中包含空格(我的就是这样)。因为我怀疑我是唯一一个遇到过这种情况的人,所以我向你们寻求一些想法。

我打算在视图中使用正则表达式来进行页面清理,但我认为最好先从其他人那里获得一些建议,然后再强行使用它。提前致谢。

【问题讨论】:

  • 内容是否都是要返回到视图的html?
  • 我相信我已经解决了这个谜团。我使用 而不是 -- 后者解决了这个问题。微软试图让事情变得简单,他们用 ASP.Net 做了很多愚蠢的决定,比如这个和其他无用的伪标记
  • @user1611050 实际上,你是对的:做出了一个愚蠢的决定,即 最初 &lt;%= 是唯一可用的,而 &lt;%: 是正确的 行为(并且是在很久以后添加的),并且应该几乎一直使用。在 razor 中,他们做对了:@foo 与 &lt;%:foo%&gt; 相同,即编码。如果您认为 &lt;%= 是更可取的行为,那么:您还没有完成足够多的 html 编程(尤其是 ASP.NET),并且没有充分考虑“xss”。编写预先形成的 html(从视图)是例外,而不是常见情况。

标签: c# html asp.net-mvc decode viewdata


【解决方案1】:

&lt;%: 表示“必要时编码”。如果你不想这样,那么 lazy 方法是使用&lt;%=,但坦率地说,我建议你改为将其包装在IHtmlString 中,例如:

string yourEncodedHtml = ...
var html = new MvcHtmlString(yourEncodedHtml);

现在,如果您存储 那个 并显示它,它应该采用“原样”的 html。

【讨论】:

  • 感谢您解释为什么该解决方案有效.. 坦率地说愚蠢的恕我直言,他们是这样设置的。
  • @user1611050 呃,为什么?几乎任何时候你输出一些东西,正确的事情就是编码它。现在想想如果你弄错了错误会产生什么影响:双重编码远比xss漏洞更可取(而且更明显)。
【解决方案2】:

尝试使用:

<%= Html.Raw(ViewData["HTMLData"].ToString())%>

是 ASP.NET 4(和 ASP.NET MVC)中 HTML 编码输出的语法

For More Details

今天如何对内容进行 HTML 编码

ASP.NET 应用程序(尤其是使用 ASP.NET MVC 的应用程序)通常依赖于使用 代码块表达式来呈现输出。今天的开发人员经常在这些表达式中使用 Server.HtmlEncode() 或 HttpUtility.Encode() 辅助方法在输出渲染之前对输出进行 HTML 编码。

虽然这很好用,但它有两个缺点:

有点啰嗦 开发人员经常忘记调用 Server.HtmlEncode 方法——而且没有简单的方法来验证它在整个应用程序中的使用情况

新的 代码块语法

在 ASP.NET 4 中,我们引入了一种新的代码表达式语法 (),它可以像 块一样呈现输出 - 但它也会自动生成 HTML在这样做之前对其进行编码。这消除了对内容进行显式 HTML 编码的需要。

我们选择了 语法,以便快速替换 代码块的现有实例。它还使您能够轻松地在代码库中搜索 元素,以查找和验证您未在应用程序中使用 HTML 编码的任何情况,以确保您的行为正确。

【讨论】:

  • 如果你调用HtmlRaw,那么你使用&lt;%:还是&lt;%=都没有关系,因此首选仍然是&lt;%:。如果第一行是&lt;%:Html.Raw(...)%&gt;,这将是问题的完美答案。
【解决方案3】:

您尝试过的事情几乎都成功了。给了我这样做的想法,这很有效:

Html.Raw(HttpUtility.HtmlDecode(ViewData["HTMLData"].ToString()))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-14
    • 1970-01-01
    相关资源
    最近更新 更多