天天看點

如何解決ASP.NET網站'__doPostBack' is undefined的腳本錯誤

  最近碰到一個很奇怪的問題!

  新釋出一個ASP.NET的網站,基于.net 4.0 framework,基本沒有用到什麼特别新的技術,但是由于給客戶預覽用的伺服器比較老,作業系統用的是Windows 2003,上面預設隻支援IIS 6。将網站釋出上去之後大部分功能都能正常運作,但是有一些操作會莫名其妙地報'__doPostBack' is undefined的腳本錯誤。在網上查找了一下錯誤産生的原因,這個是.net 4.0 framework中的一個bug,可以檢視這篇文章http://www.hanselman.com/blog/BugAndFixASPNETFailsToDetectIE10CausingDoPostBackIsUndefinedJavaScriptErrorOrMaintainFF5ScrollbarPosition.aspx

  部分ASP.NET的控件在postback的時候會失效,并且抛出'__doPostBack' is undefined的腳本錯誤,如DropDownList的SelectedIndexChanged事件觸發,RadioButtonList或CheckBoxList在postback的時候,還有LinkButton等控件。該問題隻會出現在比較高版本的IE浏覽器中(由于我本機隻有IE11,是以不确定是否較低版本的IE上也會出現該問題),FireFox和Chrome上一切運作正常。另外,在IE中将User agent string改為IE10或以下也運作正常。

如何解決ASP.NET網站'__doPostBack' is undefined的腳本錯誤

  嘗試了以下方法均無效:

  1. 重新安裝.net 4.0 framework。

  2. 在IIS中重新配置網站運作權限和.net設定項。

  3. 清除本機所有已安裝的.net framework版本然後重新安裝.net 4.0 framework。

  4. 排除網站代碼本身産生的問題。因為除了IE,其它的浏覽器均運作正常,說明代碼本身沒有問題,應該是伺服器環境所産生的。

  解決辦法:

  • 嘗試通過App_BrowsersUpdate來修補本網站的影響。在Visual Studio中可通過Nuget搜尋并下載下傳App_BrowsersUpdate,它會在網站根目錄建立App_BrowsersUpdate檔案夾,并下載下傳兩個browser檔案。該方法隻對本網站有效,并不能解決伺服器上其它網站遇到的問題。如果該方法并不奏效,可嘗試打開本機的browsers檔案并對其進行必要的修改,位址C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config\Browsers。
如何解決ASP.NET網站'__doPostBack' is undefined的腳本錯誤
  • 通過安裝hotfix來解決該問題(推薦)。安裝hotfix會影響伺服器上所有已釋出的網站。注意,如果安裝hotfix出錯或者無法安裝,可嘗試重新安裝對應版本的.net framework,然後再嘗試安裝hotfix。有的時候伺服器上安裝的.net framework版本可能不是最新的或者沒有完全安裝相應的更新檔(通常伺服器上的Windows更新被強制關閉了導緻更新檔無法自動完成安裝)是以嘗試重新安裝.net framework然後再安裝hotfix一般會奏效。
    • .Net 4 http://support.microsoft.com/kb/2600088
    • .Net 2 http://support.microsoft.com/kb/2608565, http://support.microsoft.com/kb/2608565

  如果上述方法均不奏效,可以考慮更新IIS 6到IIS 7或IIS 8.5,或者更新.net framework到4.5或更新版本,或者為網站的所有頁面加上下面的腳本:

if ($('#__EVENTTARGET').length <= 0 && $('#__EVENTARGUMENT').length <= 0) {
  $('#YOUR_ASPNET_FORMID').prepend('<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" /><input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />');
}

if (typeof __doPostBack == 'undefined') {
  __doPostBack = function (eventTarget, eventArgument) { object
    var theForm = document.forms['YOUR_ASPNET_FORMID'];
    if (!theForm) {
      theForm = document.YOUR_ASPNET_FORMID;
    }
    if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
      theForm.__EVENTTARGET.value = eventTarget;
      theForm.__EVENTARGUMENT.value = eventArgument;
      theForm.submit();
    }
  };
}      

繼續閱讀