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



在运行iOS 6.0的第三代iPad上的Safari浏览器上运行的ASP.NET web应用程序中,我很难确定间歇性问题的根源。有时,设置为通过JavaScript进行回发的超链接的<a>标签会突然停止工作,如果你在屏幕上触摸它们,它们似乎什么都不做。其中包括设置为注销链接的asp:LinkButton控件,以及设置为允许行排序的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环境的人寻求指导。我从未在桌面浏览器上遇到过这种问题。

更新:使用本页中概述的关于如何在iPad上的Safari中添加伪"查看源代码"选项的技巧,我现在可以看到回发链接工作的页面和停止回发链接的页面生成的HTML之间的差异。简而言之,ASP.NET通常嵌入在页面中的__doPostBackJavaScript函数。。。只是因为某种原因而停止了嵌入。因此,与链接绑定的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>

这似乎与苹果支持论坛和SO上描述的问题相同。后者表明,ASP.NET有时可能无法识别iPad上的Safari是否支持JavaScript,因此无法在页面中正确插入__doPostBack函数。不过,我页面上的其他JavaScript仍然运行良好,所以它不能完全解释我的问题。

在Stack Overflow上发现这个问题后,我运行了Stephen建议的browserCaps输出页面,发现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文件夹中的.brower文件中可能也会有所帮助:

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

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

asp.net:__doPostBack有时未呈现

您正在使用OutputCache吗?

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

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

查看Aristos 的原始帖子

我希望这对我有进一步的帮助。

我将下面的定义放在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>

最新更新