2012年11月6日 星期二

由VS2003 升級後的專案無法使用 Update Panel

將專案從 VS2003 升級到 VS2005 後,原本想要試試微軟新功能 Update Panel,但竟然一點效果也沒有,是不是我哪裡弄錯了呢?自己也是照著書本上一行一行打的啊?於是在 google 上開始打著 Update Panel 無路用之類的關鍵字,哈哈,還竟然真的查到許多人在討論這件事。

原來這故事,要從 XHTML 開始說起。話說 HTML 稱霸網壇數十年早已不是甚麼新鮮事,他嚴然已成為一種標準通用的標記語言,但他的缺點就是太鬆散了。大小寫不分,有沒有結束的封閉符號也不管,人這麼聰明,看懂是沒問題,但機器這麼笨,大寫小寫傻傻分不清楚。美其名是為了提昇機器的效率,其實是掩蓋機器沒那麼聰明的事實,所以大家訂了一個更嚴格的約定,都用小寫、一定要有封閉符號...,諸如此類的規定,只是為了讓機器能夠減少去做多餘的判斷,快速的達成我們所要的結果。這項別稱為近代人類的不平等條約,就是 XHTML(詳見:wiki 說明的 XHTML)。


目前 XHTML 的版本大致分為以下幾類:

  • XHTML 1.0 Strict(嚴格版): 是參照「HTML 4.01 Strict」改編,但不包括被棄用的元素。
  • XHTML 1.0 Transitional(過渡版): 是參照「HTML 4.01 Transitional」改編,包括已於Strict版本被棄用的呈現性元素(例如<center>, <font>等)。
  • XHTML 1.0 Frameset(框架版): 是參照「HTML 4.01 Frameset」改編,並允許於網頁中定義框架元素。
  • XHTML 1.1
  • XHTML Basic
然而,在微軟 .Net 1.0 、.Net 1.1 的年代裡,還是依循著早期 HTML 的快樂好日子,我的程式也是隨便寫寫,他也睜一隻眼閉一隻眼讓我過。但好景不常,隨著 .Net 2.0 降臨,開始要求要符合 XHTML 的規範,這也難怪從 VS2003 升級到 VS2005 後的程式碼,處處可見紅字。

如果專案是從 .Net 1.0、.Net 1.1 透過自動升級精靈升級到 2.0 以後的版本,為了讓先前已經寫好的程式能夠順利的渡過這青黃不接的階段,微軟提出了三種方案讓你選擇,而這個設定,就是在 web.config 檔裡的 xhtmlConformance。這三種方案分別是:


  • Legacy:他就如同早期 .net 1.0、.net 1.1 的 HTML 規範,並不會去限制你一定要遵守 XHTML 的規定。
  • Transitional:他表示要符合等同 XHTML 1.0 Transitional 的規範
  • Strict:他表示要符合更嚴格的 XHTML 1.0 Strict 的規範

而我們升級過後的專案,為了要能夠向下相容、無痛升級,所以就會主動在我們的 web.config 上加上一行:
<system.web>
      <xhtmlConformance mode="Legacy" />
</system.web>

很不巧地,我想要使用的 Update Panel 功能,他卻只能在 Transitional 與 Strict 的模式下才能執行,這也正是為何透過升級而來的專案,會出現 Update Panel  無法正常使用的狀況。所以,這時的處理方式,可以透過修改 xhtmlConformance ,將其改為 Transitional 或 Strict ,就可以讓 Update Panel 正常使用了!如果你看 xhtmlConformance 不順眼,刪了他也是可以,因為他的預設值是 Transitional。

參考:
01:XHTML
02:ASP.NET AJAX & XHTML Conformance
03:Gotcha: Don't use <xhtmlConformance mode="Legacy"/> with ASP.NET AJAX
04:.NET 2.0 Update Panel won't perform partial postbacks on upgraded 1.1 sites

沒有留言:

張貼留言