[ASP.NET]錯誤: 無法取得未定義或 Null 參考的屬性 'PageRequestManager'

執行網頁就發生「錯誤: 無法取得未定義或 Null 參考的屬性 'PageRequestManager'」的錯誤!
趕快檢查web.config是否有設定

昨天同事問說將系統從.NET 2.0升級到.NET 4.0後,就發生了以下的問題,

 

錯誤: 無法取得未定義或 Null 參考的屬性 'PageRequestManager'

Unable to get property 'PageRequestManager' of undefined or null reference.

 

image

image

 

後來辛苦的同事打拼到晚上快12點多終於發現是因為web.config中有設定  <xhtmlConformance mode="Legacy"/> ,所以會造成那個問題!

詳細請參考: Gotcha: Don't use <xhtmlConformance mode="Legacy"/> with ASP.NET AJAX

寫了簡單的程式,透過UpdatePanel去Post等操作都不會發生這樣的問題。

那這個問題怎麼發生的呢? Thinking smile

只要一開始就呼叫「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 Broken heart」....

So....請檢查一下web.config是否有設定 <xhtmlConformance mode="Legacy"/> ,可以的話,就將它移除,以免害到人……

再次感謝同事Joanne的分享, 小鴨您辛苦了~~~

Hi, 

亂馬客Blog已移到了 「亂馬客​ : Re:從零開始的軟體開發生活

請大家繼續支持 ^_^