Resolving MasterPage ClientId Issue in jQuery

摘要:Resolving MasterPage ClientId Issue in jQuery

前言:

        因為之前開發EIP,用到了許多jQuery,在目前開發上也沿用了一些之前開發的概念,而碰到了一個重要的問題,所有放在ContentPlaceHolder(MasterPage內的保留區塊)內的Control,其Control.ClientID都被加了料(請大家平心靜氣的跟我一起高喊:XX的微軟偉哉!微軟)jQuery的操作幾乎都是靠className或著ControlID來下指令,這樣子被加了料jQuery等於被廢了一隻手,於是花了一些時間找了些資料,與大家分享目前專案執行可能的可行方法,也請大家有其他想法也不吝指教。

 

參考資料

l   黑暗執行緒:

http://blog.darkthread.net/blogs/darkthreadtw/archive/2008/12/26/resolving-masterpage-clientid-issue-in-jquery.aspx

黑大在該部落格提到的做法,主要精神是:Page_Load的時候,將目前頁面內的Controls利用遞迴的方式,逐一找出並註冊在Dictionary內,接著再逐一替各個Control建立一個Class,或改變ControljQuery中的selector,來達到效果。

我自己測試的結果是不行的,如果在Page註冊的話他只找到UpdatePanel這層就不往下找了(應該是跟動態載入有關?),如果在UserControl內註冊的話,在jQuery還是找不到該UserControl內的控制項。試了很久還是沒結果就先放棄這個做法。

       

l   微軟討論區:

        http://forums.asp.net/p/1466103/3382755.aspx

        裡面提出用類似在ASP的做法,使用$("<%=ddlGroups.ClientID %>") or $("<%=ddlSubGroups.ClientID%>"),但是測試還是不行。

       

l   某位程式設計師的部落格

http://bibby.be/2008/03/masterpage-clientid.html

這位作者的想法就是在後端塞一個label並自行指定id,接著在後端註冊一個JavaScript function,其內容就是利用動態加入的labelclientID的取得被加料的字串,並加上原來的ControlID組成正確的ClientID。經測試有個問題,就是他是將方法註冊在Page上,而我們目前使用JavaScript都是寫在各自的js檔內,而js內的function叫用不到後端註冊的function

 

l   藍色小舖

http://www.blueshop.com.tw/board/show.asp?subcde=BRD20090813165009Z04&fumcde=FUM20041006161839LRJ&odr=cdt&odrtyp=0

使用$("*[id$=_controlID]")$("[id$=_controlID]")經測試是可行的。

 

結論:

        目前先請悅君採用第四個方法,先改jQueryid的方式修改,若是本來用className做為selector的就不需要修改了

 

補充:

        在找資料的同時,也查到微軟將在.NET 4.0改善這種情況。

http://www.codeproject.com/KB/aspnet/ASP_NET4_0ClientIDFeature.aspx

就請大家敬請期待吧。