6

我很难确定在运行 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 上玩了一段时间的 web 应用程序后,我也找不到任何特定的方法来重现问题,所以我什至无法开始尝试修复它,这真的很令人沮丧,所以我正在寻找那些开发过 ASP.NET 应用程序并且非常了解 iPad 和/或 Safari 环境的人的指导。我从来没有在桌面浏览器上出现过这个问题。

更新:使用此页面上概述的有关如何在 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 支持论坛SO 上描述的问题相同。后者表明 ASP.NET 有时可能无法将 iPad 上的 Safari 识别为支持 JavaScript,因此无法将__doPostBack函数正确插入页面。不过,我页面上的其他 JavaScript 仍然可以正常工作,因此它并不能完全解释我的问题。

4

4 回答 4

7

在 Stack Overflow 上找到这个问题几乎相同的问题后,我运行了Stephen 建议的browserCaps 输出页面,发现 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 识别为“高级”,这导致它在其他区域中被检测为“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";
}
于 2012-10-10T20:32:21.553 回答
0

这篇 SO post 类似,并表示启用页面输出缓存时可能会发生这种情况。

asp.net:__doPostBack 有时未呈现

你在使用输出缓存吗?

于 2012-10-10T16:59:28.460 回答
0

在 iOS7 上以 AppMode(全屏模式)运行 Umbraco 的网站遇到了同样的问题,我尝试了上述所有建议,但均无济于事。但是,我发现添加到默认浏览器的 Regexident 答案的轻微扩展似乎可以解决问题。

<capability name="jscriptversion"       value="5.6" />
<capability name="javascript"           value="true" />
<capability name="javascriptversion"    value="1.5" />

查看Aristos 的原始帖子

我希望这对我有帮助。

于 2013-10-09T11:15:09.797 回答
0

我将以下定义放入 App_Browsers 文件夹下的浏览器文件中,它运行良好。��

<browsers>
  <browser id="safariiphone" parentID="mozilla">
    <identification>
      <userAgent match="AppleWebKit"/>
    </identification>
    <capabilities>
      <capability name="version"                         value="${version}" />
      <capability name="majorversion"                    value="${major}" />
      <capability name="minorversion"                    value="${minor}" />
      <capability name="type"                            value="Safari${major}" />
      <capability name="ecmascriptversion"               value="3.0" />
      <capability name="javascript"                      value="true" />
      <capability name="javascriptversion"               value="1.6" />
      <capability name="w3cdomversion"                   value="1.0" />
      <capability name="tagwriter"                       value="System.Web.UI.HtmlTextWriter" />
      <capability name="cookies"                         value="true" />
      <capability name="frames"                          value="true" />
      <capability name="javaapplets"                     value="true" />
      <capability name="supportsAccesskeyAttribute"      value="true" />
      <capability name="supportsCallback"                value="true" />
      <capability name="supportsDivNoWrap"               value="false" />
      <capability name="supportsFileUpload"              value="true" />
      <capability name="supportsMaintainScrollPositionOnPostback" value="true" />
      <capability name="supportsMultilineTextBoxDisplay" value="true" />
      <capability name="supportsXmlHttp"                 value="true" />
      <capability name="tables"                          value="true" />
    </capabilities>
  </browser>

</browsers>
于 2014-01-28T17:13:07.210 回答