沒想到我的文章引起了那麼大的反應,看來最近MVC框架的確是一個熱門話題。正如上一篇文章開始所 說的,我不會對MVC框架有任何“貶低”,任何技術濫用都有問題,所以任何東西都會有所謂的Best Practice(去MSDN的Patterns & Practice欄目看看就知道了)。我寫這幾篇文章,是想說明,很多 WebForms的缺點是被誇大了。WebForms的確有缺點,但是我們完全可以避開,並且僅僅利用到WebForms給 我們帶來的便利。這其實也是一種Best Practice。相信以後MVC框架也一定會出現這樣的東西。
在上一篇的評論中,有朋友說我是“邊緣”的ASP.NET程序員,大概是因為我用WebForms但是拋棄 ViewState、PostBack和GridView這種“重要”的東西吧。我不知道這樣是不是“邊緣”,但是我的確拋 棄了不少東西。例如還有ADO.NET中的DataSet/DataTable——但是我們還有DataReader呢!拋棄了微軟提 供的一部分東西,我們其實可以發現,.NET裡的基礎組件一個都不少,用起來也會得心應手。
去其糟粕,取其精華。
三、生成丑陋的HTML,難以進行樣式控制
在ASP.NET的WebForms剛出現時,各種“演示”看上去真的很美。這個特點微軟至今還保留著,各微軟 技術大會上的演示真的讓人感到心潮澎湃。在我看來,那些“激素大會”更是一種推廣策略,而並沒有將 目光集中在技術細節的本身。所以微軟的東西似乎總是有入門容易提高難的“毛病”。開發人員被“寵壞 ”了,上一篇文章中有位朋友說這就是“窮人的孩子早當家”,還是有一定道理的。在.NET環境下我們就 像是官宦子弟,不過這並不能成為我們習慣於“吃喝嫖賭”的理由。我們要合理利用富裕的環境帶給我們 的資源,但是要適當地拋棄一些不好的東西。
好像說了幾句廢話,現在進入正題。說到WebForms則不得不提豐富的控件,基於ASP.NET平台的第三方 控件提供商似乎比其他平台下的總合還要多,這也是產業阿。在微軟提供的控件裡,GridView(或者1.1 裡的DataGrid)是被“演示”次數最多的,也似乎是最強大(還是差不多等同於“復雜”)的。有了 GridView之後,很多開發人員就習慣於朝頁面上拖個控件,然後再設計器裡點點鼠標,設設樣式,最後綁 定一個DataTable上去。嘩,好一個表格就此誕生。然後我們還可以響應其事件,對某一行數據進行編輯 ,刪除。太輕松了,這世界一下子變得美好了起來。不過由於GridView過於“強大”,它幾乎成為了 ASP.NET初學人員的必修課,當對於Web開發都不明就裡的初學者都習慣於GridView、GridView、GridView 時,它的濫用也就不可避免了。於是乎,做表格,用GirdView,做列表,也用GirdView(不就是個只有一 列的表格嘛)。
可惜的是,GridView有很多毛病。如果要使用GridView的高級功能(添加、修改、刪除等等), ViewState必不可少,再加上很多開發人員在綁定數據時沒有經過篩選,導致ViewState變得無比龐大(例 如顯示一個文章列表,明明只需要ID、標題,創建時間等基本信息,卻用一個“令人無比愉悅”的SELECT * FROM Article語句把文章內容也選擇了出來並綁定在GridView上,ViewState中也就不得不包含幾千幾 萬字的多余數據)。
不過現在想說的,倒是它生成出的HTML。
GridView在客戶端生成的HTML是個<table />,可惜這個<table />裡東西太多了,的確 顯得很丑陋。不過更關鍵的在於,這個表格的樣式實在難以控制。雖說GridView裡從標題到單元格到低部 都能夠進行樣式的定義,但是靈活度還是遠遠不夠。再加上GridView生成的HTML死板而不符合Web標准( 例如不會生成<th />標簽,用ControlAdaptor進行改造的做法不算),但是優秀的樣式開發人員大 都是堅定的Web標准支持或推廣者,ASP.NET對於標准支持不佳,難以控制樣式的說法滿天飛揚。
我想為WebForms喊冤。不過首先我會打倒以GridView為首的復雜控件(包擴DataList、FormView等等 )並狠狠踩上幾腳。有人說,當拋棄了GridView之後,用WebForms還有什麼意義?其實類似的話也不斷在 我說要拋棄ViewState和(復雜)的PostBack時出現。如果您覺得拋棄了這些東西WebForms就失去意義的 話,那麼我想說,ViewState、PostBack、GridView遠不是WebForms的全部。我認為,Control模型(或者 說組件化模型)才是WebForms的關鍵。而這個模型的“基礎”是絕對優秀的。下面我會進行一些展示,雖 然這些展示我覺得是基礎中的基礎。