当前位置:  开发笔记 > 编程语言 > 正文

IE中的UpdatePanel缓慢

如何解决《IE中的UpdatePanel缓慢》经验,为你挑选了1个好方法。

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

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

这是一个小视频片段,展示它是如何工作的: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中相同的代码要快得多.



1> Kon..:

如果速度/性能是您的主要关注点,我强烈建议不要使用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);

推荐阅读
有风吹过best
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有