2020年10月25日 星期日

[C# ASP.NET]開啟DropDownList.AutoPostBack而造成瀏覽器點擊上一頁後畫面與selected值不符

     在開發WebFrom時利用 DropDownList的情況,這個控制項在開啟AutoPostBack時,可以使Client端在選取變更內容時觸發PostBack。不過有一個問題,就是當Client點擊瀏覽器上一頁後,會造成DropDownList選取內容沒有跟著回到上一個狀態。

目前正常輸出畫面如下圖:

選取C選項後:

問題情況,當點選瀏覽器上一頁後,會呈現下面這個畫面 :

     可以發現很奇特的狀況,瀏覽器呈現的畫面和HTML不相符。如果有利用此控制項選取值來抓取資料的話則會產生異常狀況。

     而導致此現象的原因應該是和 onchange="javascript:setTimeout('__doPostBack(\'DDL1\',\'\')', 0)" 這一段有關。這段是控制項為了達到PostBack效果而產生的JavaScript程式碼,目的是在Client變更Select選項後Submit到Server端。

原因解析:
     瀏覽器點選上一頁後,將從Cache中回復之前瀏覽狀態,顯示畫面和HTML都是選取A的狀態(可以在瀏覽器Debug中,發現window.onload結束前都是A沒有問題)。但是瀏覽器還會回復Submit前的最後一步驟,也就是Client端 變更Select選項成C這段(可以發現在window.onload結束後,畫面上的值會瞬間變成C),所以最後才會造成如此現象。

處理方式:
     既然資料不會回到Server端,那麼只好用JavaScript在Client端把這問題修正回來。

程式碼如下:
<script type="text/javascript">
    //在window.onload結束前紀錄原本選項
    let ValTemp = document.getElementById("DDL1").selectedIndex;

    //利用setTimeout在window.onload結束後,將Select調整回原本的選項
    window.addEventListener("load", function () {
        setTimeout(function() {document.getElementById("DDL1").selectedIndex = 0;document.getElementById("DDL1").selectedIndex = ValTemp}, 0);
    }, true)
    
</script>
 


沒有留言:

張貼留言