[ASP.Net] UpdatePanel於IE中呈現資料異常緩慢

UpdatePanel於IE中呈現資料異常緩慢

症狀說明

日前維護一個案子,客戶突然發現在搜尋資料時回應速度異常的緩慢。起初懷疑DB效能不佳所造成的,所以直接查看該功能SQL語法並實際於SSMS中測試,結果發現查詢回應速度很快。再來就開始懷疑是否是網路速度所造成的問題,所以立馬透過IE的開發者工具了解一下Response的時間,發現速度也是飛快地就反應了。所以想必問題就是發生在資料呈現過程中了。

 

排除歷程

首先整理一下可疑的線索 :

1. 利用Update Panel來執行非同步的作業

2. 只有在IE中才會發生這個問題 (非常可疑)

3. 慢慢慢... 非常慢

 

就在恭請Google大神的指導後發現以下文章

Fix: UpdatePanel Async Postbacks Slow in Internet Explorer

 

原來是PageRequestManager的_destroyTree方法在IE的環境下,對於比較大的DOM tree處理的效能很差。為了呼應這個原因,我立馬回頭找找到底哪裡有大的DOM tree在我的頁面上。果不其然原來是我的分頁下拉式選單,因為這功能的資料相當龐大,所以分頁的數量高達數百頁以上,這下真相大白了,也可以安心地服用微軟所提供的解決方式了。

 

解決方式

於</Body>前加上以下的java script方法即可

<script language="javascript" type="text/javascript">

function disposeTree(sender, args) {
    var elements = args.get_panelsUpdating();
    for (var i = elements.length - 1; i >= 0; i--) {
        var element = elements[i];
        var allnodes = element.getElementsByTagName('*'),
            length = allnodes.length;
        var nodes = new Array(length)
        for (var k = 0; k < length; k++) {
            nodes[k] = allnodes[k];
        }
        for (var j = 0, l = nodes.length; j < l; j++) {
            var node = nodes[j];
            if (node.nodeType === 1) {
                if (node.dispose && typeof (node.dispose) === "function") {
                    node.dispose();
                }
                else if (node.control && typeof (node.control.dispose) === "function") {
                    node.control.dispose();
                }

                var behaviors = node._behaviors;
                if (behaviors) {
                    behaviors = Array.apply(null, behaviors);
                    for (var k = behaviors.length - 1; k >= 0; k--) {
                        behaviors[k].dispose();
                    }
                }
            }
        }
        element.innerHTML = "";
    }
}

Sys.WebForms.PageRequestManager.getInstance().add_pageLoading(disposeTree);

</script>

希望此篇文章可以幫助到需要的人

若內容有誤或有其他建議請不吝留言給筆者喔 !