不知有沒有人試過在Community Servery 2.1上加掛ASP.NET AJAX?

原則上,只要利用之前提過的方法修改Community Server的web.config檔,接著試著新增一個WebForm1.aspx,拉拉ScriptManager,UpdatePanel,Label,Button的馬上就可以體驗到在Community Server網站"新增"ASP.NET AJAX網頁的快感! 有沒有留意到我強調"新增"? 重點來了,就在初試成功,想要快快樂樂地為Blog首頁也加上各式AJAX特效時,不久會被"Extender controls may not be registered after PreRender."錯誤訊息電到手腳發軟~~~

在Community Server, ASP.NET AJAX與AJAX Control Toolkit的Souce Code裡追了幾個晚上,我大概了解其中的祕辛。Community Server引進了一套Skin/Theme的概念,也就是如你現在所看到的Blog頁面,其實是由一個個.ASCX所拼湊而成的,而且可以隨意切換。舉例來說,我們可以為"最新回應"清單設計出兩個不同的ASCX,後端的元件只負責由資料庫中取出資料,至於前端要用Repeater或DataGrid來呈現,完全由ASCX決定。這種做法提供了極大的客製化彈性,但背後乃是透過一些幾近Hacking的手法完成的,其中一個重要環節便是巧妙地override了Render、PreRender這些事件!  無奈英雄所見略同,ASP.NET AJAX也要依懶PreRender來達成輕輕鬆鬆將原有元件升級的神奇魔法,於是二者在Control的生命週期假設上有了衝突...  說來話長,總結一句,要解決這個衝突,得去更動二者其中之一的核心架構,會產生多大的後遺症無法評估...

可是,你也許注意到了,現在Blog右方的導覽SideBar可以動態開合,這不就是ASP.NET AJAX Control Toolkit中的Accordion嗎? 明明就說不能整合了,這又是怎麼做到的呢?

對由ASP.NET AJAX入門的人來說,AJAX是透過拖拖拉拉Web Control,寫寫Server-Side Event達成的;而在JavaScript老鳥的眼裡,ASP.NET AJAX只是一群好心的Developer為了讓不會Javascript的初心者也能使用AJAX的善心義舉,說穿了還不就是靠Javascript+DOM在表演。我用的賤招是先做一個Accordion的網頁,查出它用了哪些js,手工蒐集下來,一一在我的ASCX中用<script src="/img/loading.svg" data-src="..">包含進來,AJAX Control Toolkit的設計很棒,絕大部分複雜的邏輯都在.js中,網頁中只需要再加一兩行Javascript就可以完成預期的效果。就這樣,明明不能相容的兩個東西,就這樣硬是整在一起了,Kero Kero Kero Kero....

不過,如果有人找到可以真的在Community Server Skin ASCX中使用AJAX Control的方法,記得跟我說,我會幫忙寫一篇"CommunityServer + ASP.NET AJAX 明媒正娶篇"。


Comments

# by rovy

好贱

Post a comment