IE中的UpdatePanel缓慢

我正在开发一个ASP.Net应用程序,并努力为它添加一些Ajax来加速某些领域。 我所关注的第一个领域是教师报告孩子出勤率(以及其他一些数据)的出勤区域。 这需要很快。

我创建了一个双控制设置,用户点击图标,通过Javascript和Jquery我弹出第二个控件。 然后我使用__doPostBack()来刷新弹出控件以加载所有相关数据。

这是一个小video片段,展示它是如何工作的: http : //www.screencast.com/users/cyberjared/folders/Jing/media/32ef7c22-fe82-4b60-a74a-9a37ab625f1f (:21并忽略音频背景)。

对于每个“弹出”,它在Firefox和Chrome中的速度比我想要的慢2-3秒,但它在IE中完全不可行,每次弹出和加载时都需要7-8秒。 并且忽略了在数据被更改后保存数据所需的任何时间。

这是处理弹出窗口的javascript:

function showAttendMenu(callingControl, guid) { var myPnl = $get('" + this.MyPnl.ClientID + @"') if(myPnl) { var displayIDFld = $get('" + this.AttendanceFld.ClientID + @"'); var myStyle = myPnl.style; if(myStyle.display == 'block' && (guid== '' || guid == displayIDFld.value)) { myStyle.display = 'none'; } else { // Get a reference to the PageRequestManager. var prm = Sys.WebForms.PageRequestManager.getInstance(); // Unblock the form when a partial postback ends. prm.add_endRequest(function() { $('#" + this.MyPnl.ClientID + @"').unblock({ fadeOut: 0}); }); var domEl = Sys.UI.DomElement; //Move it into position var loc = domEl.getLocation(callingControl); var width = domEl.getBounds(callingControl).width; domEl.setLocation(myPnl, loc.x + width, loc.y - 200); //Show it and block it until we finish loading the data myStyle.display = 'block'; $('#" + this.MyPnl.ClientID + @"').block({ message: null, overlayCSS: { backgroundColor:'#fff', opacity: '0.7'} }); //Load the data if(guid != '') { displayIDFld.value = guid; } __doPostBack('" + UpdatePanel1.ClientID + @"',''); } }} 

首先,我不明白为什么__doPostBack()在IE中引入了这样的延迟。 如果我把它和prm.add_endRequest拿出来,那就非常快,因为没有发生回发。

其次,我需要一种方法来弹出这个控件并刷新数据,使它仍然是交互式的。 我没有与UpdatePanel结婚,但我无法弄清楚如何使用Web服务/静态页面方法。 如您所见,此控件在同一页面上多次加载,因此页面大小和下载速度是个问题。

我很欣赏任何想法?

编辑:它在IE 6或7中是相同的。我认为它与IE处理UpdatePanel有关,因为在FF和Chrome中相同的代码要快得多。

如果速度/性能是您的一个主要问题,我强烈建议不要使用UpdatePanels,因为它们会导致整页回发拖动标题中的ViewState,以及其他垃圾,并强制页面每次都经历整个生命周期(即使用户没有看到这一点)。

您应该能够(相对容易地)使用PageMethods来完成您的任务。

 // In your aspx.cs define the server-side method marked with the // WebMethod attribute and it must be public static. [WebMethod] public static string HelloWorld(string name) { return "Hello World - by " + name; } // Call the method via javascript PageMethods.HelloWorld("Jimmy", callbackMethod, failMethod); 

它仅是IE的已知问题,请参阅KB 2000262 。 可在此处找到解决方法/修复程序。 我和他们一起使用脚本,很遗憾他们无法解决问题。

在之前的一个项目中注意到,当我们在页面上有大量文本框时,IE变得非常慢,在用fiddler检查后,我们发现渲染引擎很慢。

(顺便说一下,在你们大声喊叫之前,150多个文本框是一个明确的客户要求,我们基本上在网上重新创建了自定义的Excel)

这是弹出控件的代码(页面上只有一个由包含图标的所有控件共享):

    

为了找出为什么花了这么长时间我会建议使用Fiddler监视你的IE流量: http : //www.fiddlertool.com/fiddler/

您将查看每条消息的响应,以查看它们的大小。 如果消息大于5kb,则UpdatePanel太小了。

这听起来像是一件非常简单的事情,所以我很难相信更新面板应该受到责备。 测试它应该不会太困难。 在没有UpdatePanel的情况下测试此方法的最简单方法是使用PageMethod。 这个页面有一个很棒的教程: http : //weblogs.asp.net/sohailsayed/archive/2008/02/23/calling-methods-in-a-codebehind-function-pagemethods-from-client-side-using-using -ajax-net.aspx

您是否也可以发布您的UpdatePanel代码,以便我们获得更多详细信息?

编辑:谢谢!

您使用的是哪个版本的IE?

使用DOM和HTTP请求本质上很慢,它是浏览器。 加快速度的最佳方法是减少HTTP请求(AJAX或其他)的次数,减少DOM操作的数量,搜索,编辑,替换等。

我建议使用链接文本进行性能跟踪。 它是Internet Explorer中AJAX性能分析的免费工具