iPad上的Safari偶尔不会';无法识别ASP.NET回发链接
在运行iOS 6.0的第三代iPad上,在Safari浏览器上运行的ASP.NET web应用程序中,我很难找出间歇性问题的根源。有时会发生的情况是,iPad上的Safari偶尔不会';无法识别ASP.NET回发链接,asp.net,ipad,safari,Asp.net,Ipad,Safari,在运行iOS 6.0的第三代iPad上,在Safari浏览器上运行的ASP.NET web应用程序中,我很难找出间歇性问题的根源。有时会发生的情况是, iPad上运行的Safari是否有什么特别之处,可以防止此类链接偶尔中断,例如页面或其他打开的浏览器选项卡上加载了太多数据,或者在这种情况下可能出现ViewState问题?即使在iPad上玩了一段时间的web应用程序,我也找不到任何特殊的方法来重现问题,因此我甚至无法尝试修复它,这真的令人沮丧,因此我正在寻找那些开发ASP.NET应用程序并非常
iPad上运行的Safari是否有什么特别之处,可以防止此类链接偶尔中断,例如页面或其他打开的浏览器选项卡上加载了太多数据,或者在这种情况下可能出现ViewState问题?即使在iPad上玩了一段时间的web应用程序,我也找不到任何特殊的方法来重现问题,因此我甚至无法尝试修复它,这真的令人沮丧,因此我正在寻找那些开发ASP.NET应用程序并非常了解iPad和/或Safari环境的人的指导。我从来没有在桌面浏览器上出现过这个问题
更新:使用关于如何在iPad上的Safari中添加伪视图源选项的技巧,我现在能够看到生成的HTML中的差异,其中回发链接正在工作的页面和停止的页面。简而言之,ASP.NET通常嵌入在页面中的\uuu 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>
//
这似乎与和上描述的问题相同。后者表明ASP.NET有时可能无法将iPad上的Safari识别为具有JavaScript功能,因此无法将\u doPostBack功能正确插入页面。尽管如此,我页面上的其他JavaScript仍然可以正常工作,因此它并不能完全解释我的问题。这篇文章与此类似,并说在启用页面输出缓存时可能会发生这种情况 您正在使用OutputCache吗?在发现堆栈溢出几乎存在相同的问题后,我运行了Stephen建议的,并发现Safari在iPad主屏幕上的链接以全屏模式运行时,在我们的ASP.NET服务器上显示为一个通用的无功能浏览器。我在另一个问题中应用了Avada Kedavra建议的修复方法,其中包括:
<browserCaps userAgentCacheKeyLength="256" />
在发生故障的主网页的代码隐藏文件中,另一个人修复的来源在其发现的评论部分中也指出,将其添加到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";
}
string ua=Request.UserAgent;
如果(ua!=null
&&(ua.IndexOf(“iPhone”,StringComparison.CurrentCultureIgnoreCase)>=0
||ua.IndexOf(“iPad”,StringComparison.CurrentCultureIgnoreCase)>=0
||ua.IndexOf(“iPod”,StringComparison.CurrentCultureInoRecase)>=0)
&&ua.IndexOf(“Safari”,StringComparison.CurrentCultureInogoreCase)<0)
{
this.ClientTarget=“uplevel”;
}
对于在iOS7上以AppMode(全屏模式)运行Umbraco的站点,我遇到了同样的问题,我尝试了上面的所有建议,但都无济于事。然而,我发现对上面Regexident的答案稍加扩展,添加到默认浏览器中,似乎就可以做到这一点
<capability name="jscriptversion" value="5.6" />
<capability name="javascript" value="true" />
<capability name="javascriptversion" value="1.5" />
看看原件
我希望这对我有帮助。我将下面的定义放在App_Browsers文件夹下的浏览器文件中,效果非常好。 ��
这是一个很好的发现,但不幸的是,我的解决方案中没有定义OutputCache。我还仔细检查了IIS中的输出缓存设置,但没有列出任何设置。也许您使用UA字符串的方法是正确的,并且使用了错误的浏览器帽。您使用的是.NET的哪个版本。Net1.x在识别IE以外的任何东西时都表现得非常糟糕。2.x(一直到3.5)也不是很好。事实上,他们在4.0上取得了一些不错的进展,他们可以识别出一些移动设备(我认为所有的iOS设备都被识别为iPhone)。我的下一步是在这里复制代码,然后使用iPad从服务器上浏览,看看他们认为你在使用什么浏览器。这是一个.NET4.0应用程序。如果你好奇的话,我把Safari的浏览器放在iPad上。我看不出有什么东西会立即向我扑来,可能是什么导致了这个问题。这个平台是“未知的”,但这并不一定能解释为什么JavaScript有时能工作,有时不能。嗯,我似乎找到了另一个人,我注意到我的问题通常是在应用程序从主屏幕链接以全屏模式启动后开始的。我正在进一步调查。看起来我上面列出的链接中建议的修复方法有效!当我的应用程序停止工作时,检查浏览器的caps信息会生成您可以看到的列表。Stephen,再次感谢您的帮助-我对您关于检查浏览器封顶的建议投了赞成票,因为这让我找到了正确的答案,但我将用不同的答案总结我的解决方案,因为它最终与OutputCache无关。太好了!这对我有效:)我对listview的分页不起作用。应用了web.config和pagepreinit修复程序,现在可以正常工作了。万分感谢@扩散系数
<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>
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";
}
<capability name="jscriptversion" value="5.6" />
<capability name="javascript" value="true" />
<capability name="javascriptversion" value="1.5" />
<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>