渲染 Asp Menu 控件的动态项





5.00/5 (3投票s)
Asp Menu 控件在 Internet Explorer 8 中无法呈现其动态可见性设置的项。微软也已在微软官方确认
Asp Menu 控件在 Internet Explorer 8 中无法呈现其动态可见性设置的项。微软已在微软支持中确认,此特定问题存在于其部分产品[1]。经过系统测试,微软发现 IE 并非问题所在,但 asp menu 控件确实存在问题 [2]。 出现此问题的原因是 asp menu 控件错误地假设了其动态项的 CSS 属性 z-index 的值。该控件在其他浏览器(如 IE-7、IE-6、Firefox 等)中按预期运行。
此问题有一些解决方法;
解决 Asp Menu 控件问题的微软 Hotfix
IE-8 发布后不久,报告了此错误,微软发布了 Hotfix 来解决此问题。此 Hotfix 适用于 Windows XP 和 Windows Vista。
此 Hotfix 的知识库可以在这里找到;
http://support.microsoft.com/kb/962351
http://support.microsoft.com/?id=981201
Hotfix 本身可以从以下位置下载;
http://code.msdn.microsoft.com/KB962351/Release/ProjectReleases.aspx?ReleaseId=2294
http://code.msdn.microsoft.com/KB967535/Release/ProjectReleases.aspx?ReleaseId=2328
尽管此 Hotfix 适用于基于 Framework 2.0 构建的应用程序。对于后来的 Framework,知识库 (KB981201) 建议联系微软支持部门以获取此 HotFix。
覆盖动态项的 z-index 属性
由于问题是由于错误的 z-index 假设,我们可以将动态项的 z-index 设置为高于所有控件 z-index 的最大值。 这解决了 asp menu 控件的问题,并使用了给定的 z-index 值。
要实现此解决方案,请在 CSS 文件中为 asp menu 动态项的 z-index 添加一个 CSS 类
.DynamicItemZIndex
{
z-index:1000;
}
在皮肤文件中,将此 CSS 类用作 asp menu 控件的 DynamicMenuStyle-CssClass
<asp:Menu
<%-- some other properties --%>
DynamicMenuStyle-CssClass="DynamicItemZIndex"
<%-- some other properties --%>
>
</asp:Menu>
这种解决方法非常好,因为我们不需要在任何浏览器或控件级别的功能上妥协。 此外,使用此技术不会包含任何外部资源。
在 IE-8 中模拟 IE-7
IE-6 和 IE-7 不会干扰 asp menu 控件呈现其动态项。 因此,另一种解决方案是添加一个 Meta 标记来在 IE-8 中模拟 IE-7。 这也解决了问题。
要实现此解决方案,请在页面级别添加一个 Meta 标记以模拟 IE-7
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
<%--Emulating IE-7--%>
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Menu ID="Menu1" runat="server" >
<%-- some properties --%>
</asp:Menu>
</div>
</form>
</body>
</html>
此 Meta 标记也可以在 web.config 文件中的应用程序级别添加
<configuration>
<system.webServer>
<httpProtocol>
<customHeaders>
<clear />
<add name="X-UA-Compatible" value="IE=EmulateIE7" />
</customHeaders>
</httpProtocol>
</system.webServer>
</configuration>
使用 CSS 友好控件适配器
CSS 友好适配器已根据 HTML 和 XHTML 标准进行设置。 这些适配器会根据标准呈现许多 asp 控件(菜单、TreeView、DetailsView 等),从而减少控件呈现和浏览器兼容性问题。
要实现此解决方案 [3]
- 从 codeplex 下载 CSS 友好适配器程序集和浏览器文件,网址为 http://cssfriendly.codeplex.com/
- 在您的项目中添加对该程序集的引用。
- 添加 App_Browsers 文件夹并将适配器的浏览器文件放在其中。
通过这种方式,CSS 适配器将以正确的方式呈现控件。 当您希望根据标准构建站点并希望使其符合新浏览器的标准时,CSS 友好适配器很好,但使用这些适配器也会降低性能,尤其是在页面的呈现阶段。
另一个值得注意的要点是,当前 CSS 友好适配器只能与 ASP.NET 2.0 一起使用。 尽管如此,新版本仍在开发过程中。
其他浏览器的解决方案
IE-8 现在已成为最高标准兼容浏览器 (100%)。 但其他浏览器仍在运行不兼容的版本。 Firefox 3 为 90%,而 Opera 9 为 85% 的标准兼容[4]。 Chrome 和 Safari 的比例也不完美。
Asp menu 控件在这些浏览器中的某些浏览器中也存在问题,例如 Safari。
可以通过清除控件适配器(在 Page_Load 事件中)或将页面呈现为之前的浏览器(在 Page_PreInit 事件中)来实现 Chrome 和 Safari 等浏览器中此问题的解决方案
protected void Page_Load(object sender, EventArgs e)
{
if (Request.UserAgent.Contains("AppleWebKit"))
{
Request.Browser.Adapters.Clear();
}
}
protected void Page_PreInit(object sender, EventArgs e)
{
if (Request.UserAgent.Contains("Safari"))
{
Page.ClientTarget = "uplevel";
}
}