asp.net - iPad 上的 Safari 有时无法识别 ASP.NET 回发链接

标签 asp.net ipad safari

在运行 iOS 6.0 的第三代 iPad 上的 Safari 浏览器上运行的 ASP.NET Web 应用程序中,我很难查明间歇性问题的根源。有时会发生这样的情况:<a>设置为通过 JavaScript 进行回发的超链接的标签将突然停止工作,并且如果您在屏幕上触摸它们,它们似乎不会执行任何操作。其中包括设置为注销链接的 asp:LinkBut​​ton 控件,以及设置为允许行排序的 GridView 标题行。这背后似乎没有任何规律或原因——它们会正常工作一段时间,然后停止,稍后我会注意到它们再次开始工作(主要是在关闭 Safari 并重新打开它之后,尽管这并不总是如此)似乎有效)。

注销控件在 aspx 文件中如下所示:

<asp:LinkButton ID="LogoutButton" onclick="LogoutButton_Click" runat="server">[ Logout ]</asp:LinkButton>

在生成的 HTML 中显示如下:

<a id="LogoutButton" href="javascript:__doPostBack(&#39;ctl00$LogoutButton&#39;,&#39;&#39;)">[ Logout ]</a>

在 iPad 上运行的 Safari 是否有任何特殊之处可能会阻止此类链接偶尔中断,例如页面或其他打开的浏览器选项卡中加载的数据过多,或者可能是某些原因在这种情况下起作用的 ViewState 是什么?即使在 iPad 上玩了一段时间的网络应用程序后,我也找不到任何特定的方法来重现问题,所以我什至无法开始尝试修复它,这真的很令人沮丧,所以我正在寻找来自开发 ASP.NET 应用程序并非常了解 iPad 和/或 Safari 环境的人员的指导。我在桌面浏览器上从未遇到过此问题。

更新:使用 this page 上概述的技巧关于如何在 iPad 上的 Safari 中添加伪“查看源代码”选项,我现在已经能够看到回发链接正常工作的页面和停止的页面生成的 HTML 中的差异。简而言之,ASP.NET 通常嵌入到页面中的 __doPostBack JavaScript 函数...只是由于某种原因而停止嵌入。结果,与链接相关的 JavaScript 就会出错。以下是 ASP.NET 通常添加到页面以使回发链接正常工作的内容:

<script type="text/javascript">
//<![CDATA[
var theForm = document.forms['form1'];
if (!theForm) {
    theForm = document.form1;
}
function __doPostBack(eventTarget, eventArgument) {
    if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
        theForm.__EVENTTARGET.value = eventTarget;
        theForm.__EVENTARGUMENT.value = eventArgument;
        theForm.submit();
    }
}
//]]>
</script>

这似乎与 Apple support forum 中描述的问题相同。和 here on SO 。后者表明 ASP.NET 有时可能无法将 iPad 上的 Safari 识别为支持 JavaScript,因此无法正确地将 __doPostBack 函数插入页面中。不过,我页面上的其他 JavaScript 仍然工作正常,因此它并不能完全解释我的问题。

最佳答案

找到this question后在 Stack Overflow 上,我遇到了几乎同样的问题,我运行了 browserCaps output page根据 Stephen 的建议,我们发现 Safari 当通过 iPad 主屏幕上的链接以全屏模式运行时,在我们的 ASP.NET 服务器上显示为通用的、无功能的浏览器。我应用了 Avada Kedavra 在另一个问题中建议的修复,其中需要添加以下内容:

<browserCaps userAgentCacheKeyLength="256" />

...进入<system.web>我的 web.config 文件的部分,还有这个:

protected void Page_PreInit(object sender, EventArgs e)
{
   if (Request.UserAgent != null && Request.UserAgent.IndexOf("AppleWebKit", StringComparison.CurrentCultureIgnoreCase) > -1)
   {
      this.ClientTarget = "uplevel";
   }
}

在正在运行的主网页的代码隐藏文件中。 Jason Kealey ,其他人的修复来源,还在他的发现的评论部分中建议,将其添加到 ASP.NET Web 应用程序的 App_Browsers 文件夹中的 .browser 文件中也可能会有所帮助:

<browsers>
  <browser refID="Mozilla" >
    <capabilities>
      <capability name="cookies"  value="true" />
      <capability name="type" value="Uplevel" />
    </capabilities>
  </browser>

  <browser refID="Default">
    <capabilities>
      <capability name="cookies" value="true" />
      <capability name="type" value="Uplevel" />
    </capabilities>
  </browser>
</browsers>

编辑: 我将此修复应用于我的应用程序,但它破坏了其他区域,具体来说,它将 Chrome 和 Safari 识别为“uplevel”,这导致它在其他区域中被检测为“IE”。下面的代码使得此修复仅适用于未在用户代理中识别为 Safari 的 iDevices:

string ua = Request.UserAgent;
if (ua != null
    && (ua.IndexOf("iPhone", StringComparison.CurrentCultureIgnoreCase) >= 0
    || ua.IndexOf("iPad", StringComparison.CurrentCultureIgnoreCase) >= 0
    || ua.IndexOf("iPod", StringComparison.CurrentCultureIgnoreCase) >= 0)
    && ua.IndexOf("Safari", StringComparison.CurrentCultureIgnoreCase) < 0)
{
    this.ClientTarget = "uplevel";
}

关于asp.net - iPad 上的 Safari 有时无法识别 ASP.NET 回发链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12804493/

相关文章:

c# - MVC 3 C# - 部署和 MYSQL 数据库

ios - iPad 的通用应用程序无法加载 iPad .xib 文件?

safari - 脚本 Safari 5.1 打开选项卡

c# - c#中的日期格式转换

asp.net - 可以 asp :Button with Visible=False be submitted by a malicious user?

ASP.NET MVC 如何创建自定义角色提供程序

objective-c - 如何注册应用程序以在我的 iPad 应用程序中打开 pdf 文件

iphone - 是否有可用于 iPhone/iPad 开发的第三方库可以帮助我在屏幕上制作二维矩阵 View ?

javascript - 通过忽略 div 标签 javascript 的内部元素来选择文本

reactjs - AWS Cognito 不适用于 IE 11,但适用于所有其他浏览器