連續忙了好幾個月,好久沒有寫東西了,最近稍微有點空,閒置時候回到了對ASP.NET MVC RC(以下簡稱MVC RC)的研究上來。MVC RC的“腳手架(Scaffold)”功能可以說為MVC RC的開發如虎添翼,不過應用到真實的開發環境中似乎存在一些遺憾的地方:很多時候我們並不希望把Models、Views和Controllers放在同一個項目裡面,而是把它們分離到不同的項目,然後由一個項目(比如Views)統一引用其他所有的項目程式集。但是這樣做了以後,Controllers項目中腳手架的功能就“消失了”。
在Web(MVC RC)項目中,我們可以這樣在Web項目中使用腳手架建立View頁面:
或者建立Controller檔案:
甚至可以在Controller檔案中自動建立或者查看對應Action的View頁面:
不過這一切經曆了Views和Controllers的“生死離別”之後,就再也無法在Controllers中使用了(原因會在下文中說明)。下面我們來做一個測試。
首先我們先把M、V、C三層分離,比如這樣:
需要注意的是當這樣做的時候,在Controllers項目中需要引用以下這三個核心的程式集:
System.Web.Abstractions.dll
System.Web.Mvc.dll
System.Web.Routing.dll
以及一些在預設的Controller.cs檔案中被引用到的命名空間,如:
System.Web
System.Configuration
以下是分離M-V-C(M之所以也要分離出去是因為C需要引用M,而C不能引用V)之後,啟動並執行預設介面,說明這樣的分離是成功的:
OK,到此為止MVC工作正常,只不過……無法在MyMvc.Controllers中使用MVC的腳手架:
分析一下原因:我們在把Controller分離出來的時候是建了“類庫(Class Library)”,一個普通的類庫當然無法使用MVC(Web)的腳手架,於是我開啟了MyMvc.Web的專案檔MyMvc.Web.csproj,用記事本開啟這個檔案(本質上是一個XML檔案),發現了一個和其他項目與眾不同的地方:
<ProjectTypeGuids>{603c0e0b-db56-11dc-be95-000d561079b0};{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>
這個節點中用分號分割了3段看似Guid的代碼,分別是:
{603c0e0b-db56-11dc-be95-000d561079b0}
{349c5851-65df-11da-9384-00065b846f21}
{fae04ec0-301f-11d3-bf4b-00c04f79efbc}
立刻對比了一下MyMvc.Controllers下面的MyMvc.Controllers. csproj,發現沒有這個節點。喜出望外!於是馬上將這個節點複製到MyMvc.Controllers. csproj對應的地方,重新附加元件目以後,發現MyMvc.Controllers的腳手架功能回來了!
不過通過這樣簡單的添加還是發現了一些小小的瑕疵:細觀MyMvc.Controller的項目表徵圖類型,怎麼和Web的時一樣的()?不爽。
看來這樣的直接複製是把整個MVC Web Application下面的類型都一起複製過來了,為了避免日後不必要的麻煩,還是需要讓Controllers變回“類庫”,於是打起了那三個Guid的注意,經過兩次兩兩搭配後({fae04ec0-301f-11d3-bf4b-00c04f79efbc}一定要保留)發現,只要刪除中間的{349c5851-65df-11da-9384-00065b846f21}之後,MyMvc.Controllers項目又回到了“類庫”的狀態:
於是猜測{fae04ec0-301f-11d3-bf4b-00c04f79efbc}對應了Web Application的項目類型,而{603c0e0b-db56-11dc-be95-000d561079b0}對應了MVC RC的模板。
注意:{603c0e0b-db56-11dc-be95-000d561079b0}對應了MVC RC(v1.0)的項目代碼,
如果您使用的是MVC 2.0(包括Preview版本在內),對應的編碼為:{F85E285D-A4E0-4152-9332-AB1D724D3325} !
如果您使用的是MVC 3.0(包括Beta和RC版本在內),對應的編碼為:{E53F8FEA-EAE0-44A6-8774-FFD645390401} !
通過以上這些操作,分離了M-V-C結構,並且在Controllers中“完整”保留了MVC RC的腳手架的功能。
上面的“完整”之所以要突出一下,是因為這種保留實在是太“完整”了,以至於在Controller中自動添加View頁面會添加到Controller項目中,而不是我們所希望的MyMvc.View項目中(查看對應View頁面也存在相同的問題)。這倒是個大問題,如果這個問題不解決,那麼“腳手架”反而成了“絆腳石”,這個問題如何解決呢?
請看下一篇《為ASP.NET MVC RC分離C-V項目後添加“腳手架”功能(二)》
(本文的執行個體也在《ASP.NET MVC RC分離C-V項目後添加“腳手架”功能(二)》中提供下載。)