[ASP.NET]為什麼我的控制項的 id 多了ctl00

最近同事說他們有個ASP.NET 4.0 WebForm專案在預設的網站中執行 JavaScript 是OK的,
但是如果將它搬到另一個網站後,JavaScript 執行就會發生錯誤!
他查了一下發現發生錯誤的網站物件的Id前面多了 ctl00_

環境

ASP.NET 4.0 WebForm

Visual Studio 2010

 

問題

最近同事說他們有個 ASP.NET 4.0 WebForm 專案 在預設的網站中執行 JavaScript 是OK的,

但是如果將它搬到另一個網站後,JavaScript 執行就會發生錯誤!

他查了一下發現發生錯誤的網站物件的Id前面多了 ctl00_ 。

 

研究

ASP.NET 4.0 多了一個叫 clientIDMode 的東西,詳細可參考「Control.ClientIDMode 屬性」。

而ASP.NET 4.0 以前的版本 clientIDMode 都是使用 AutoID ,所以物件的 id 前面會多加入 ctl.._ 。

而ASP.NET 4.0 預設的 clientIDMode 是使用 Predictable。

所以看起來似乎是  clientIDMode 設定的問題。

結果檢查專案的 web.config 中並沒有設定。

那是那裡有問題呢???

就再往上一層找,結果發現可以work的系統中,在IIS的Root目錄中並沒有web.config,

而有問題的的系統,在IIS的Root目錄下,有一個web.config,裡面有設定 clientIDMode 為 AutoID ,

<pages clientIDMode="AutoID" />

因為專案中沒有設定 clientIDMode,所以就使用上層的設定,就使用 AutoID 。

所以就造成了 JavaScript 的錯誤。

 

解決方案

1.在專案的 web.config 中設定 clientIDMode 為 Predictable。

<system.web>
    <pages clientIDMode="Predictable" />
    <!-- ... 其他 設定 ... -->
</system.web>

 

2.將有問題的系統,Root目錄的web.config移除,以避免污染到本專案。

PS.除非該網站只有我們系統來使用,否則要評估是否會影響到別的系統哦!

Hi, 

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

請大家繼續支持 ^_^