asp.net菜单控件在Safari中无法正确显示

问题描述:

我正在使用的网站使用Databound asp:Menu控件。当发送1个菜单项时,它呈现的HTML在Firefox(和IE)中绝对正确,但是在Safari和Chrome中确实搞糟了代码。以下是发送给每个浏览器的代码。我已经测试了几个浏览器,并且它们都非常类似地渲染,所以我只在渲染源上发布了两个变体。asp.net菜单控件在Safari中无法正确显示

我的问题是:我如何让ASP.NET发送相同的HTML和JavaScript到Chrome和Safari,因为它对Firefox和IE呢?

<!-- This is how the menu control is defined --> 
<asp:Menu ID="menu" runat="server" BackColor="#cccccc" 
    DynamicHorizontalOffset="2" Font-Names="Verdana" StaticSubMenuIndent="10px" StaticDisplayLevels="1" 
    CssClass="left_menuTxt1" Font-Bold="true" ForeColor="#0066CC"> 
    <DataBindings> 
     <asp:MenuItemBinding DataMember="MenuItem" NavigateUrlField="NavigateUrl" TextField="Text" 
      ToolTipField="ToolTip" /> 
    </DataBindings> 
    <StaticSelectedStyle BackColor="#0066CC" HorizontalPadding="5px" VerticalPadding="2px" 
     Font-Names="Verdama" CssClass="left_menuTxt1" Font-Bold="true" /> 
    <StaticMenuItemStyle HorizontalPadding="5px" VerticalPadding="8px" /> 
    <DynamicMenuStyle BackColor="#fbfbfb" BorderColor="#989595" BorderStyle="Inset" BorderWidth="1" 
     Width="80px" VerticalPadding="1" /> 
    <DynamicMenuItemStyle HorizontalPadding="5px" VerticalPadding="2px" Font-Name="Verdama" 
     ForeColor="#c6c4c4" CssClass="left_menuTxt1" Font-Bold="true" /> 
    <DynamicSelectedStyle BackColor="#cccccc" HorizontalPadding="5px" VerticalPadding="2px" 
     Font-Names="Verdama" CssClass="left_menuTxt1" Font-Bold="true" /> 
</asp:Menu> 
<!-- From Safari View Page Source (Chrome source very similar) --> 
<span title="Order" class="ctl00_leftNav_menu_4"> 
<a class="ctl00_leftNav_menu_1 ctl00_leftNav_menu_3" 
    href="javascript:__doPostBack('ctl00$leftNav$menu','oMy Order')"> 
My Order 
<img src="/WWW/WebResource.axd?d=glUTEfEv7p9OrdeaMxkMzhqz2JugrMr8aE43O2XGHAA1&amp;t=633590571537099818" 
alt="Expand My Order" 
align="absmiddle" 
style="border-width:0px;" /></a></span><br /> 


<!-- From Firefox View Page Source (IE View page similar) --> 
<table> 
<tr onmouseover="Menu_HoverStatic(this)" 
    onmouseout="Menu_Unhover(this)" 
    onkeyup="Menu_Key(event)" 
    title="Order" 
    id="ctl00_leftNav_menun0"> 
    <td> 
    <table class="ctl00_leftNav_menu_4" cellpadding="0" cellspacing="0" border="0" width="100%"> 
    <tr> 
     <td style="white-space:nowrap;width:100%;"> 
      <a class="ctl00_leftNav_menu_1 ctl00_leftNav_menu_3" 
      href="../Order/OrderList.aspx"> 
My Order 
      </a> 
     </td> 
     <td style="width:0;"> 
      <img src="/WWW/WebResource.axd?d=glUTEfEv7p9OrdeaMxkMzhqz2JugrMr8aE43O2XGHAA1&amp;t=633590571537099818" 
       alt="Expand My Order" style="border-style:none;vertical-align:middle;" /> 
     </td> 
    </tr> 
    </table> 
</td> 
</tr> 
</table> 

更新:我的解决方案后是正确的..但我不能记住我自己是正确的...因此,如果有人想复制它,所以我可以关闭此。 :)

我从weblogs.asp.net的评论中发现此解决方案。 这可能是一个黑客,但它确实有效。

这种跨浏览器兼容性的斗争正在让人不安。

if (Request.UserAgent.IndexOf("AppleWebKit") > 0) 
    { 

     Request.Browser.Adapters.Clear(); 

    } 

如果任何人有一个更好的解决方案,它与其说是一个黑客,我想如果你张贴感激。从我广泛的网页搜索中,看起来我并不孤单,因为菜单控件存在这个问题,所以一些好的参考将会帮助其他人在相同的情况下。

+0

我的代码在我的评论中的作品,是解决方案..但我不能标记自己是正确的......所以如果有人想复制它,所以我可以关闭它。 :) – stephenbayer 2008-12-30 18:16:57

+0

我喜欢这个解决方案最好的。您还应该注意IE8中的问题,解决方案可以在这里找到: http://weblogs.asp.net/mhildreth/archive/2009/01/26/testing.aspx(CSS解决方案) http:// weblogs.asp.net/bleroy/archive/2009/03/23/asp-menu-fix-for-ie8-problem-available。aspx(修补程序) – 2009-06-22 19:35:06

+0

在Chrome中也存在同样的问题,并猜测相同的解决方案适用于!奖励! +1 – 2010-04-27 09:59:43

我对asp:菜单控件和webkit也有问题。另外,很难完全按照我想要的方式进行设计。我的建议是使用CSS友好控制适配器:

本菜单的表格转换成更加现代和搜索引擎友好的标记。你的菜单看起来更像这样:

<ul class="AspNet-Menu"> 
    <li class="Leaf Selected"> 
    <a href="Orders.aspx" class="Link Selected">Orders</a></li> 
    <li class="ALeaf"> 
    <a href="MyOrders.aspx" class="Link">My Orders</a></li> 
</ul> 

在我的测试中,标记在所有浏览器中都是一样的。

这里的,如果你有多个Web应用程序来解决这个问题是Chrome和Safari浏览器的最简单的方法:

创建一个名为safari.browser中的“%SystemRoot%\ Microsoft.NET \框架[版本]文件\ CONFIG \浏览器”包含以下内容:

<browsers> 
    <browser refID="Safari1Plus"> 
     <controlAdapters> 
      <adapter controlType="System.Web.UI.WebControls.Menu" 
        adapterType="" /> 
     </controlAdapters> 
    </browser> 
</browsers> 

这会告诉asp.net不呈现Safari的菜单控件时使用的适配器。 Safari1Plus在mozilla.browser文件的末尾定义在相同的目录中。这也适用于Chrome,因为它们都使用webkit,这是asp.net如何识别Safari1Plus。

下运行的%SystemRoot%\ Microsoft.NET \框架[版本] \ aspnet_regbrowsers -i

这将编译所有的浏览器文件为一个程序集,并将其添加到GAC。

现在asp.net菜单将在safari和chrome中正确渲染。

或者,您可以将文件添加到每个Web应用程序的App_Browsers目录中。

+0

有人提供了一个有效的答案! w00t!前段时间我确实得到了这个工作,但我只是测试了这个解决方案,并且工作得很好。 – stephenbayer 2009-01-12 16:02:20

添加ClientTarget="uplevel"到页指令,像这样让野生动物园的工作:

<%@ Page ClientTarget="uplevel" ... %> 

Mayank Sharma发现,母版页的作品,而不是编辑单个页面的解决方案。所有使用母版页的页面都可以无缝修复。这仍然是一个黑客攻击,但你做你必须做的。这里有一个准系统示例母版页代码。

using System; 
using System.Web.UI; 

/// <summary> 
/// Summary description for ExampleMasterPage 
/// </summary> 
public class ExampleMasterPage : MasterPage 
{  
    public ExampleMasterPage() { } 

    protected override void AddedControl(Control control, int index) 
    { 
     if (Request.ServerVariables["http_user_agent"] 
      .IndexOf("Safari", StringComparison.CurrentCultureIgnoreCase) != -1) 
     { 
      this.Page.ClientTarget = "uplevel"; 
     } 
     base.AddedControl(control, index); 
    } 
} 

这里是@Mayank Sharma/@jball C#版本转换为VB.NET。感谢修复的人,几个月来一直困扰着我。我的问题是MAC和PC上的每个浏览器都工作,除了IE8和Chrome。不过,就像我喜欢它一样,Chrome往往无法运行Google文档 - 解决这个问题!

Protected Overrides Sub AddedControl(ByVal control As Control, ByVal index As Integer) 
    If Request.ServerVariables("http_user_agent").IndexOf("fake_user_agent", StringComparison.CurrentCultureIgnoreCase) <> -1 Then 
     Me.Page.ClientTarget = "uplevel" 
    End If 
    MyBase.AddedControl(control, index) 
    End Sub 

你会注意到我必须检查“fake_user_agent”而不是“Safari”。

我只是想提交一个替代选项。这适用于ASP.NET 3.5。

  • 添加“App_Browsers文件”文件夹ASP.NET到您的项目
  • 创建该文件夹
  • 在浏览器文件中的浏览器文件中,添加<browsers>标签之间以下代码:

    <browser id="Chrome" parentID="Safari1Plus">
    <controlAdapters>
    <adapter controlType="System.Web.UI.WebControls.Menu" adapterType="" />
    </controlAdapters>
    </browser>

这应该正确呈现在Chrome/Safari浏览器的菜单控制。

Chrome和Safari无法正确呈现菜单控件的问题是由于导航跳过链接图像框由Chrome和Safari呈现。

如果您对跳过链接的图像执行css display: none;,那么菜单控件就像它应该定位一样。

我已经在一个简单的1级菜单上测试了这个,而不是嵌套菜单。

http://www.s-t-f-u.com/2011/05/05/asp-net-menu-control-positioning-in-safari-google-chrome/

像魔术一样工作!

If Request.ServerVariables("http_user_agent").IndexOf("Safari", StringComparison.CurrentCultureIgnoreCase) <> -1 Or Request.UserAgent.Contains("AppleWebKit") Then 
     Request.Browser.Adapters.Clear() 
     Page.ClientTarget = "uplevel" 
    End If