這是關於ASP.Net常被問到的一個問題,很老很老的概念,但也是一個比較容易一知半解的問題。自問了一下,似乎揣着明白說不清楚,於是做點功課整理一下。
首先,爲什麼會有Web服務器控件、Html服務器控件和Html控件
Html控件無需多說,最常用的控件,ASP時代的唯一選擇,世界開始的時候它就在那。當微軟推出.Net後,爲了提供ASP.Net Web Form開發以和Win Form開發相似的開發體驗,推出了Web服務器控件(Server Control),又稱ASP.Net服務器控件。而Html服務器控件(Html Server Control),則可以看做是爲了向下兼容,便於原本基於ASP系統的移植而推出的一種介於Html控件和Web 服務器控件的權宜產物。
Web服務器控件、Html服務器控件和Html控件的區別
- Html控件的標籤:<input id="Button" type="button" value="Button" />
- Html服務器控件的標籤:<input id="Button" type="button" value="Button" runat="server" />
- Html服務器控件其實就是Html控件的基礎上加上runat="server"所構成的控件
- Web服務器控件的標籤:<asp:Button ID="Button" runat="server" Text="Button"/>
- Web服務器控件會根據情況在瀏覽器端產生一個或多個對應的Html標籤。
- Html服務器控件位於System.Web.UI.HtmlControls
- Web服務器控件位於System.Web.UI.WebControls
- Web服務器控件與Code Behind的Class文件相結合,提供了包含屬性、方法和事件的完整對象模型。
- Html控件不能在服務器端控制,只能在瀏覽器端通過javascript等腳本語言操作。
- Html服務器控件設定了runat="server" 屬性後,頁面對象會將該控件載入控制器,服務器端的代碼就能對其進行控制。
- Html服務器控件在頁面執行完畢後會被轉換成Html標註,然後當成字符串流發送到瀏覽器端,瀏覽器端的腳本能夠進行操作。
- Web服務器控件的操作則是由頁面把Form發回服務器,然後完全由服務器端代碼處理。
- Html控件的事件處理髮生在瀏覽器端,除非Submit,否則不會發生Postback
- Html服務器控件的事件處理髮生在瀏覽器端。
- Html服務器控件如果要Postback到服務器端,調用服務器端的方法,需要添加onserverclick之類的事件。
- Web服務器控件部分默認爲AutoPostback,或者可以設置AutoPostback。
- 在產生Postback或是重新生成頁面時,Web服務器控件自動保存狀態到ViewState。
- Html控件和Html服務器控件需要自己編碼實現。
Web服務器控件、Html服務器控件和Html控件的優缺點
- Html控件和Html服務器控件需要編碼以保持瀏覽器兼容。
- Web服務器控件能夠檢測瀏覽器的兼容性,保持表現的一致。
- Html服務器控件通過爲Html控件添加runat="server"以實現ASP程序的移植。
- 將ASP程序移植成使用Web服務器控件的ASP.Net程序相當於重寫新的應用。
- Html控件和Html服務器控件是標準控件,能夠用瀏覽器端腳本語言操作。
- 使用Web服務器控件提供的對象模型,能夠得到和Win Form類似的編程體驗,而且無需再學習不同的腳本語言。
- Web服務器內部的代碼並不開放,你無法獲得比較直接的控制。
小結
個人認爲,Html服務器控件作爲一個過渡的實現,雖然能夠兼顧瀏覽器端和服務器端,終究是一個奇怪的存在,儘量少使用爲妙。從微軟的角度,良好封裝的Web服務器控件提供了大量的便利,同時Web Form和Win Form開發模式的差異使得相互的經驗能夠互通,當然是多使用Web服務器控件爲好。不過Web服務器控件的缺點是佔用服務器資源,頁面Postback過多(Ajax啊Ajax)。所以現實是存在的就是合理的,Html還是要會地,Javascript當然是要好好學地,Web開發各種奇奇怪怪的標籤共存於Page中的場面短時間內是不可能消失地。
參考資料
《html控件、html服務器控件和web服務器控件的區別》 (原出處不詳,請Google)
<Difference Between ASP.NET Server Controls,HTML Server Controls and HTML Intrinsic Controls>
原文鏈接 http://humblepg.com/chs/2009/06/asp-dot-net-web-server-control-html-server-control-html-control.html