為ASP.NET MVC RC分離Controllers-Views項目后添加“腳手架”功能(一)(已添加MVC2.0及MVC3.0更新)
連續忙了好幾個月,好久沒有寫東西了,最近稍微有點空,空閑的時候回到了對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項目后添加“腳手架”功能(二)》中提供下載。)
轉載請注明出處和作者,謝謝!
作者:JeffreySu / https://github.com/JeffreySu/
博客:https://szw.cnblogs.com/

浙公網安備 33010602011771號