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

时间:2012-08-20 07:13:52

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

我几天都在讨论这个问题,我不确定我的环境或代码本身是否存在问题基于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就好了,但无论我尝试什么,它都会强制执行blasted编码。根据我在MSDN上阅读的内容,有一个关于HTML没有被正确解码的问题的脚注,其中包含空格(我的确如此)。因为我怀疑我是唯一一个面对这个问题的人,所以我会向你们寻求一些想法。

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

2 个答案:

答案 0 :(得分:12)

<%: 表示“必要时进行编码”。如果您不想这样,那么 lazy 方法将使用<%=,但坦率地说,我建议您将其包装在IHtmlString中,例如:

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

现在,如果你存储那个并显示它,它应该按照“原样”使用html。

答案 1 :(得分:8)

尝试使用:&lt;%=%&gt;

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

&lt;%:%&gt;是ASP.NET 4(和ASP.NET MVC)中HTML编码输出的语法

For More Details

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

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

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

有点冗长 开发人员经常忘记调用Server.HtmlEncode方法 - 并且没有简单的方法来验证其在应用程序中的使用情况

新&lt;%:%&gt;代码块语法

在ASP.NET 4中,我们引入了一种新的代码表达式语法(&lt;%:%&gt; ),其呈现类似于&lt;%=%&gt;的输出块做 - 但在这之前也会自动对HTML进行编码。这消除了对显式HTML编码内容的需要。

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