最近項目中運用了地區三級關聯,用的是最普通的DropDownList回發來實作的,如下圖

一直用着都挺好的,可最近客戶最近新換了台伺服器,我把網站遷移過去就有了問題,三級關聯失效了。
首先申明一點,這個三級關聯雖然是用伺服器控件做的,但代碼是沒有錯的,我一點可以确認,不是網上經常看到的那些伺服器控件屬性設定不對或方法使用不正确。
網站運作環境
新伺服器:Windows Server2008 64位系統,IIS7,應用程式.net Framework 版本4.0、托管管道為內建模式、32位相容模式。
原伺服器:Windows Server2008 32位系統,IIS7,應用程式.net Framework 版本4.0、托管管道為內建模式。
本地開發:Windows 7 32位系統,IIS express 8,VS2012
測試環境:我自己機器上 IE10,Firefox21,Chome27,同僚機器上IE6、7、8、9外加360,遨遊、QQ之類的浏覽器。
測試結果:隻有在新伺服器和IE10組合時開會出現錯誤(就是DropDownList控件的OnSelectedIndexChanged事件失效、現象就是下拉框更改選擇後頁面不回發了)。
附:對新伺服器中網站的抓包如下
注意:在IE10中,各種浏覽器模式和文檔模式都一一試過,結果都是一樣。
從源碼可以看出,伺服器傳回給IE10的Html代碼中沒有onchange事件。
看到這裡,不知道各位會認為錯誤出現在什麼地方?
我的第一反應是錯誤出在伺服器方,應該不是浏覽器的問題,因為我們都知道,浏覽器隻是執行Html代碼,而Html代碼都是由伺服器端動态傳回的,很明顯伺服器傳回給IE10的Html代碼中丢失了onchange事件。再對比網站的伺服器環境我把重心放到了64位系統上,因為新、舊伺服器也就這點不同,結果掉坑裡去了,把網站重新設定為64位環境編譯了一遍,編譯過程還挺曲折的,引用元件System.Data.SQLite.dll沒法在64位下運作,費了老大勁,花了大把時間給搞定,結果錯誤依舊。
到這裡我又不得不懷疑是浏覽器問題了,但是同僚都沒有用IE10的,到目前為止也就我機器上測試到這個錯誤。想起老闆新買的筆記本是Win8的是以就把連結發給他,讓他看看IE11下是不是有問題。結果老闆一看我發的消息裁圖,北京市都跑四川了,以為資料庫出錯了,直接叫經理來解決問題。
經理過來一不看代碼,二不看伺服器,直接認定我浏覽器設定有問題,一番設定後,居然“好了”,其實就是把目前網站加入到IE的相容性清單裡(具體做法就是在IE菜單欄工具中将目前網站添加相容性視圖)。
我一直以為F12中浏覽器模式設定為“IE10相容性視圖”和IE菜單欄工具中的添加相容性視圖是一樣的,沒想到還有有些差別。
讀了後面這段,就會明白其實這個差别隻是時間差,在工具欄中添加的相容性視圖在請求時就是以相容性視圖請求的。而F12中的相容性視圖接收到的Html代碼是以IE正常模式講求的,隻以相容性視圖解析而已。
我們開發時遇到問題一般有兩種解決方式,一種像我們經理這樣,還有一種就是從根本上解決。我一般不贊成這種表面解決問題的方式,是以我就繼續找解決方案,既然問題出現在IE中,我試着用IE10之類的關鍵字搜尋,最後用“asp.net IE10”Google時了一篇英文文章大概是這個意思,接着搜尋才找到兩篇中文的。原文連結我也找不到了,大概意思就是,asp.net4.0出生得比IE10早,是以asp.net4.0以前版本不認識IE10 的 User-Agent 标頭,導緻的後果就是ASP.NET 特定功能失效,例如:頁面報錯__doPostBack找不到,不支援 Cookies 功能等等。這屬于.net的Bug,微軟也釋出了更新檔。我沒找到文章中的更新檔(不知道是後續更新檔覆寫了還是不同系統更新檔編号不同),但我更新新伺服器中的所有更新檔後,錯誤沒有了。
來自為知筆記(Wiz)Time=2013-06-22 22:16:47