我很难在运行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('ctl00$LogoutButton','')">[ 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 forum和here on SO中描述的问题相同。后者表明,ASP.NET有时可能无法将iPad上的Safari识别为支持JavaScript,因此无法在页面中正确插入 __ doPostBack 功能。我的页面上的其他JavaScript仍然可以正常工作,因此它无法完全解释我的问题。
答案 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)
答案 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>