这些WebKit ASP之间的区别:菜单修复

Dev*_*rke 2 asp.net webkit google-chrome aspmenu

我知道ASP上有很多帖子:菜单与WebKit问题一般,但我找不到能回答我问题的帖子.

我经常看到人们推荐两种不同的方法来解决ASP:MenuApple WebKit浏览器中的问题(即Chrome,Safari).但哪个更好?除了目标用户代理之外,这两个操作之间有什么区别?我找到的唯一区别是第二个也将对Page_Load事件起作用.我假设一个客观上优于另一个,但我不知道它们之间的区别.他们每个人如何运作?

两者都进入Page_PreInit()基页的方法.

1.清除浏览器适配器.

if (Request.UserAgent.Contains("AppleWebKit"))
{
    Request.Browser.Adapters.Clear();
}
Run Code Online (Sandbox Code Playgroud)

2.更改客户端目标.

if (Request.UserAgent.Contains("Safari"))
{
    Page.ClientTarget = "uplevel";
}
Run Code Online (Sandbox Code Playgroud)

Google Chrome的默认用户代理如下.它包含Safari和WebKit,所以我怀疑目标用户代理是一个显着的差异.

Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.X.Y.Z Safari/525.13.
Run Code Online (Sandbox Code Playgroud)

Dev*_*rke 7

好吧,我自己"解决"了这个问题,因为其他人显然都不知道.实际答案是ASP.NET将使用WebKit的浏览器识别为"低级"浏览器,这意味着它们无法处理现代HTML或JavaScript.为了补偿,ASP.NET使用"适配器"以不同方式呈现菜单标记.

在情况2.(更改客户端目标)中,强制客户端被识别为"uplevel"浏览器.因此,菜单会正常呈现,就像Internet Explorer或FireFox一样.

在情况1.(清除浏览器适配器),客户端仍被视为下层并且插入适配器以补偿所谓的旧浏览器,但在可以使用之前,所有适配器都被刷新.

因此,我得出结论,技术方法2.更好,因为

  1. 在使用适配器之前,它可以有效地停止下层浏览器补偿.
  2. 它正确地将浏览器识别为高级,以防该事实在应用程序的其他地方使用.
  3. 它不清除适配器,它们可以合法地用于用户的其他目的.
  4. 正如我在我的问题陈述中所说,它可以用在Page_Load方法而不是Page_PreInit方法上,从而允许将其添加到母版页而不需要继承的基页.