上一篇《為ASP.NET MVC RC分離Controllers-Views項目後添加“腳手架”功能(一)》 中講到如何分離Controllers和Views項目,並且為Controllers項目添加MVC RC的“腳手架”,可惜“腳手架”的功能保留的過於完整,以至於自動建立和察看View頁面都會在當前項目中進行,除非你心甘情願每次建立完成後手動將檔案轉移到Views(Web)項目,否則這個“腳手架”的意義幾乎就失去了。並且,及時轉移了.aspx之類的View檔案,那麼查看還是在當前項目中進行,這可怎麼辦呢?本文將為此創造一個“一石二鳥”的方法,可以同時解決View頁面新增和查看的問題。
View查看
由於沒功夫研究這個“腳手架”內部的機制(如果有朋友能夠實現hack的話也就不用這麼麻煩了,呵呵),所以想到了一個變通的方法:能不能在Controller對應的地方加上一些“捷徑”,然後當查看的時候直接尋找源檔案呢?經過了一些嘗試,發現直接創捷徑檔案(.lnk)是行不通的。
於是又打起了MyMvc.Controllers.csproj的主意。經過一些測試研究,發現. Csproj檔案支援一個<Link>的標籤,可以在VS程式中起到“捷徑”的效果(具體如何設定節點在本文後面提供的解決方案程式和下載代碼中可見,這裡不再詳述)。
經過一系列測試,這些被Link的檔案不會被編譯到MyMvc.Controllers.Dll中,OK,View的問題就此告一段落,剩下的工作由統一的解決方案來完成。
View新增
既然MyMvc.Controllers中的View都是沒有實際意義的捷徑,那麼新增的檔案顯然也不能讓他留在MyMvc.Controllers項目中,於是想到了“乾坤大挪移”——把建立的View自動移動到MyMvc.Web項目中,並且在MyMvc.Controllers.csproj中將對應的檔案編程一個“捷徑”。
最終解決方案——MvcScaffoldTool
MvcScaffoldTool是本人原創,並開源的一個用於解決之前提到的腳手架建立、查看檔案路徑問題的小工具,也同樣適用於其它一些類型項目的其他地方。
既然要從外部入手,那麼最直接、最自動的方法當然是寫一個程式,用於自動“監控”MyMvc.Controllers中的狀態,當其發生變化的時候自動轉移檔案並且處理對應的. Csproj檔案。
由於很少做WinForm,所以粗製濫造了一個:
實現代碼已經提供下載,這裡不再佔用大家寶貴的視野。
由於時間有限,暫時只做了一些基本的功能。原理大致如下:
指定Views(Web)和Controllers專案檔夾及檔案,監視Controllers專案檔對應節點的變動,當發現有新檔案加入的時候,立即將該檔案轉移到Web項目下,並且修改兩個項目的專案檔(.csproj),為Controllers項目中的對應檔案建立“捷徑”,同時為Web項目建立真實的檔案包含。
除了以上這些準系統,還有一些可以擴充和最佳化的地方,比如當Web下面刪除一些View頁面的時候,使Controllers中的捷徑也同步刪除,原理與上面類似。另外,MvcScaffoldTool自動隱藏後會運行在後台,目前只能通過“任務管理”將其關閉(此功能已升級)並縮小到系統開始欄的系統托盤:
雙擊該圖表可以恢複操作視窗的顯示,同時暫停監測。
注意:以上方法在VS2008(Sp1)和VS2010中測試成功,由於尚不知道VS2005及以下版本是否有辦法安裝官方提供的MVC RC及其“腳手架”,所以未作測試,也歡迎反饋。
MvcScaffoldTool的使用方法
MvcScaffoldTool的使用很簡單:
1、將MvcScaffoldTool.exe複製到解決方案(一般即所有專案檔的上級目錄):
2、在需要使用Controllers中的腳手架建立View頁面之前運行MvcScaffoldTool.exe(和項目一起開啟也可以),並選擇正確的專案檔夾和專案檔:
程式會優先選擇.csproj類型的檔案作為專案檔,如果有多個,可以自行選擇。
3、單擊“確認並啟動”按鈕,MvcScaffoldTool.exe會建立一個xml檔案並在後台運行。如果已經建立過xml檔案,以上的設定會從xml檔案中讀取,不必每次開啟都設定。
------------------------------------------------------------------------------------------------
接下去的操作和普通使用MVC RC開發幾乎一模一樣。
4、使用Controllers項目中的“腳手架”從Action中建立View頁面:
5、Controlllers下面會自動建立對應的View頁面:
奇怪,怎麼MvcScaffoldTool.exe怎麼沒有起作用呢?別急,請看下一步:
6、現在刪除檔案還來得及,如果確認添加,點擊“全部儲存”按鈕:
7、不出意外地話,你馬上會看到這樣的提示:
以及:
不用擔心,這說明修改已經成功,單擊“重新載入”即可。
重新附加元件目後的結果:
可以清楚地看到,MyMvc.Controllers下面剛才建立的.aspx檔案已經轉移到了MyMvc.Web下面,同時原來的檔案成了一個捷徑。點擊這個捷徑即可查看MvcScaffoldTool.aspx的原檔案。
8、怎麼還沒有完?對!還有“Go to View”沒有測試呢!
單擊MvcScaffoldTool()中的Go to View:
這時候雖然“解決方案管理器”中的當前檔案是MyMvc.Controllers下面的一個捷徑,不過開啟的檔案卻是MyMvc.Web下真實的View檔案:
MvcScaffoldTool更新日誌
2009-2-27 v1.0.0
完成MvcScaffoldTool準系統。
2009-2-27 v1.1.0
解決MvcScaffoldTool必須在“工作管理員”中關閉的問題。
使MvcScaffoldTool可以在開始欄中以托盤方式最小化,在後台運行。
2009-2-28 v1.2.0
添加為Views項目自動建立必要目錄的功能,解決“重複重新載入”的bug。
以下下提供MvcScaffoldTool原始碼及分離V-C的測試原始碼:
v2.0.0.0版本exe檔案下載:/Files/szw/MvcScaffoldTool-v2.0.0.0.rar
原始碼SVN:http://mvc-scaffold-tool.googlecode.com/svn/trunk/
開源項目首頁:http://code.google.com/p/mvc-scaffold-tool/
MyMvc 原始碼
PS:寫這篇文章旨在提供一種可行的思路,如果大家有什麼更加好的方法也請不吝賜教!由於從發現問題到開發MvcScaffoldTool再到寫這兩篇文章總共只有3個多小時的時間,如此倉促肯定會有不少問題,不周之處望大家包涵,同時歡迎大家反饋:)