ASP.NET MVC 将原始 HTML 从控制器传递到视图

新手上路,请多包涵

这几天我一直在摸不着头脑,我不确定这是我的环境问题还是基于 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 未正确解码而导致的问题,其中包含空格(我的是这样)。因为我怀疑我是唯一遇到过这个问题的人,所以我向你们寻求一些想法。

我正准备用我的方式在视图中使用正则表达式来清理页面,但我认为在我强行使用它之前先从其他人那里获得一些建议会更好。提前致谢。

原文由 Dave 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 312
2 个回答

<%: _表示_“必要时编码”。如果你不想那样,那么 懒惰 的方法是使用 <%= ,但坦率地说,我建议你改为将它包装在 IHtmlString 中,例如:

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

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

原文由 Marc Gravell 发布,翻译遵循 CC BY-SA 3.0 许可协议

尝试使用: <%= %>

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

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

更多细节

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

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

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

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

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

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

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

原文由 Kapil Khandelwal 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题