ASP.NET MVC将原始HTML从Controller传递到View

Dav*_*ave 6 html c# asp.net-mvc viewdata decode

我已经对这个问题感到头疼了几天,我不确定这是否是我的环境或代码本身的问题,这是基于ASP.NET MVC(尽管我有5年的C#经验).我正在使用最新的Win7x64和VS 2008的干净安装以及所有补丁.

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

ViewData["HTMLData"] = DAO.HTMLDataGet();
Run Code Online (Sandbox Code Playgroud)

当我看到输出时,它被转义/ HTML编码.我尝试使用以下所有这些似乎无法解决此问题:

<%: HttpUtility.HtmlDecode(ViewData["HTMLData"].ToString())%>
Run Code Online (Sandbox Code Playgroud)

和...

<%: Server.HtmlDecode(ViewData["HTMLData"].ToString())%>
Run Code Online (Sandbox Code Playgroud)

和...

<%: Html.Raw(ViewData["HTMLData"].ToString())%>
Run Code Online (Sandbox Code Playgroud)

...它从数据库表中抓取原始HTML就好了,但无论我尝试什么,它都会强制执行blasted编码.根据我在MSDN上阅读的内容,有一个关于HTML没有被正确解码的问题的脚注,其中包含空格(我的确如此).既然我怀疑我是唯一一个面对这个问题的人,我会向你们寻求一些想法.

我即将以我的方式克服我的方式,在视图中使用正则表达式来进行页面清理,但是我认为在我强行推断之前先从其他人那里得到一些建议会更好.谢谢你提前.

Mar*_*ell 12

<%: 表示 "必要时编码".如果你不想这样,那么懒惰的方法就是使用<%=,但坦率地说,我建议你把它包装起来IHtmlString,例如:

string yourEncodedHtml = ...
var html = new MvcHtmlString(yourEncodedHtml);
Run Code Online (Sandbox Code Playgroud)

现在,如果您存储的是和表现出来,它应该采取的HTML"原样".

  • @ user1611050呃,为什么?实际上,无论何时输出内容,*正确*都要对其进行编码.现在想想如果你得到它会产生什么影响*错误*:与xss漏洞利用相比,双重编码是更好的(并且更加明显). (2认同)

Kap*_*wal 8

尝试使用: <%=%>

<%= Html.Raw(ViewData["HTMLData"].ToString())%>
Run Code Online (Sandbox Code Playgroud)

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

更多细节

如何HTML编码今天的内容

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

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

这是一个有点冗长的开发人员经常忘记调用Server.HtmlEncode方法 - 并没有简单的方法来验证它在应用程序中的使用

新的<%:%>代码块语法

在ASP.NET 4中,我们引入了一种新的代码表达式语法( <%:%> ),它可以像<%=%>块一样呈现输出 - 但在执行此操作之前,它还会自动对HTML进行编码.这消除了对显式HTML编码内容的需要.

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