我已经为此苦思冥想几天了,不确定是我的环境问题还是代码本身的问题,因为我是基于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未正确解码而包含空格(我的确有),可能会导致问题。既然我怀疑我不是唯一面临这个问题的人,我转向你们寻求一些想法。
我即将在视图中使用正则表达式来进行页面清理,但在我粗暴地处理之前,认为最好先从其他人那里得到一些建议。提前感谢您的帮助。
<%=
可用,而<%:
才是正确的行为(并且后来才添加),几乎所有情况下都应该使用它。在 Razor 中,他们做得很对:@foo
和<%:foo%>
是一样的,即编码过的。如果你认为<%=
是更可取的行为,那么:你还没有做足够的 HTML 编程(不仅仅是 ASP.NET),也没有考虑到“xss”的问题。编写预先格式化的 HTML(从视图中)是例外,而不是常见情况。 - Marc Gravell