執行網頁就發生「錯誤: 無法取得未定義或 Null 參考的屬性 'PageRequestManager'」的錯誤!
趕快檢查web.config是否有設定
昨天同事問說將系統從.NET 2.0升級到.NET 4.0後,就發生了以下的問題,
錯誤: 無法取得未定義或 Null 參考的屬性 'PageRequestManager'
Unable to get property 'PageRequestManager' of undefined or null reference.
後來辛苦的同事打拼到晚上快12點多終於發現是因為web.config中有設定 <xhtmlConformance mode="Legacy"/> ,所以會造成那個問題!
詳細請參考: Gotcha: Don't use <xhtmlConformance mode="Legacy"/> with ASP.NET AJAX
寫了簡單的程式,透過UpdatePanel去Post等操作都不會發生這樣的問題。
那這個問題怎麼發生的呢?
只要一開始就呼叫「Sys.WebForms.PageRequestManager.getInstance()」,就會發生錯誤。如下,
web.config
<?xml version="1.0"?>
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.5"/>
<xhtmlConformance mode="Legacy"/>
</system.web>
</configuration>
ASPX
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<script type="text/javascript">
function Beg(sender, args) { }
</script>
</head>
<body>
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server" />
<script type="text/javascript" >
Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(Beg);
</script>
</form>
</body>
</html>
So, 只要您有一開始使用「Sys.WebForms.PageRequestManager.getInstance()」 + <xhtmlConformance mode="Legacy"/> ,您就中招了!
如果設定 <xhtmlConformance mode="Legacy"/> ,在.NET 2.0的程式也是會有相同的問題(因為那個Blog是在2006年PO的)!
那前面不是說升到 4.0 才發生這問題嗎?
因為有些Tag是從另一個專案Copy過來的,剛好那個系統有使用VS 2005升級VS 2003的專案,所以有加入那個Tag。
而那個專案也沒有用到Ajax,所以就沒發現這個問題。So.... 讓我聯想到現在正紅的「Heartbleed 」....
So....請檢查一下web.config是否有設定 <xhtmlConformance mode="Legacy"/> ,可以的話,就將它移除,以免害到人……
再次感謝同事Joanne的分享, 小鴨您辛苦了~~~
Hi,
亂馬客Blog已移到了 「亂馬客 : Re:從零開始的軟體開發生活」
請大家繼續支持 ^_^