iPad上的Safari偶尔也无法识别ASP.NET回发链接

时间:2012-10-09 16:33:27

标签: asp.net ipad safari

我很难在运行iOS 6.0的第三代iPad上的Safari浏览器上运行的ASP.NET Web应用程序中查明间歇性问题的根源。会发生的情况是,有时,设置为通过JavaScript进行回发的超链接的<a>标记会突然停止工作,如果您在屏幕上触摸它们,它们似乎什么都不做。其中包括设置为注销链接的 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环境的人的指导。我从来没有在桌面浏览器上出现过这个问题。

更新:使用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 forumhere on SO中描述的问题相同。后者表明,ASP.NET有时可能无法将iPad上的Safari识别为支持JavaScript,因此无法在页面中正确插入 __ doPostBack 功能。我的页面上的其他JavaScript仍然可以正常工作,因此它无法完全解释我的问题。

4 个答案:

答案 0 :(得分:6)

在Stack Overflow上发现this question几乎同样的问题后,我运行了Stephen建议的browserCaps output page并发现Safari,当从iPad主屏幕上的链接以全屏模式运行时,我们的ASP.NET服务器作为通用的,无功能的浏览器出现。我在其他问题中应用了Avada Kedavra建议的解决方案,其中包括:

<browserCaps userAgentCacheKeyLength="256" />

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

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文件中也可能会有所帮助: / p>

<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";
}

答案 1 :(得分:0)

此SO帖子类似,并说当启用页面输出缓存时会发生这种情况。

asp.net: __doPostBack not rendered sometime

您使用的是OutputCache吗?

答案 2 :(得分:0)

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

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

查看原始post by Aristos

我希望这对我有所帮助。

答案 3 :(得分: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>