最近,看到很多的關注並使用asp.net mvc的網友,都在尋找一種分離網站前後台結構的方法。Asp.net mvc 1.0正式版,並沒有給我們提供一種很好的解決方案。對於1.0正式版中,通常的做法,就是用命名首碼來解決的。比如:AdminProductController,UserProductController,ProductController,但是,此類的命名冗長,一旦項目龐大複雜,變得很臃腫難以管理。而且終究不是完美的解決方案。
Asp.net mvc 2.0 preview 1,提供了一種解決方案:area。它是根據項目分離來實現的。所以,不敢保證未來正式版中也是這樣,只能說,是臨時解決方案。
下面,我將具體列出幾個步驟。展示area的用法。
開發環境:VS2008 SP1,ASP.NET MVC 2.0 Preview 1
添加項目的時候,不要添加測試專案,保持清潔。
步驟 0 :
建立一個Web項目,:主專案。
步驟1:
在解決方案上建立解決方案檔案夾,取名Areas
在Areas解決方案檔案夾裡,添加一個新的web項目,最後管理員後台項目。
步驟2:
清除Areas下項目不需要的檔案:
清除AspnetMvcArea.Web.Admin項目下,一下一些檔案:
1. /Content 目錄下檔案及子檔案夾
2. /Scripts 目錄下檔案及子檔案夾
3. /Controllers 下檔案及子檔案夾
4. /Views 下檔案及之檔案夾,但保留web.config檔案。
5. 刪除項目Global檔案。
步驟3:
卸載項目:AspnetMvcArea.Web以及AspnetMvcArea.Web.Admin
步驟4:
修改專案檔。
1. 修改主專案:AspnetMvcArea.Web
修改AspnetMvcArea.Web.csproj檔案內容,用記事本之類的編輯器開啟。
取消一中的註解:
A.
B.
2. 修改子項目:AspnetMvcArea.Web.Admin
同上,取消中的註解:AspnetMvcArea.Web.Admin.csproj
A.
B.注意,此處的需別。其實,英文寫的很清楚了。
儲存以上修改,退出。回到vs環境。
步驟5. 重新附加元件目。
載入剛才卸載的兩個項目。
步驟6. 在子項目上,添加控制器及視圖。
1. 添加AccountController,就是為了和主專案預設添加的AccountController名稱相同。
2.在AccountController的Action上各自添加視圖。
LogOn:
LogOff:
步驟7:添加路由類庫
在解決方案上,添加一個類庫: AspnetMvcArea.MapRoutes,並建立一個Routes靜態類。
注意添加引用的版本:2.0
Routes靜態類內部:
步驟8. 在主專案AspnetMvcArea.Web中,添加AspnetMvcArea.Web.Admin和AspnetMvcArea.MapRoutes的引用。
修改主專案AspnetMvcArea.Web中的Global檔案
步驟9:在AspnetMvcArea.Web.Admin項目上,修改AccountController控制器的各個視圖。
1. Index視圖
2. LogOn視圖
3. LogOff視圖
步驟10,基本以完成大部分了。現在就是修改一個串連。以便測試。
1. 修改主專案Views/Shared/Site.Master
2.修改主專案Views/Shared/LogOnUserControl.ascx
步驟11:完結?
當然,如果真的完成了,那也算完美。可惜。。。啟動並執行時候,發現,area地區找不到視圖。
這個是視圖定位問題。修改的辦法,就是改Areas項目名稱以及程式集名稱和命名空間。全部和area名稱保持一致。
把AspnetMvcArea.Web.Admin項目的名稱,程式集名稱以及命名空間,全改為和定義的area名稱一致:Admin。
在編譯項目的時候,會在主專案下,產生Areas檔案夾,看下檔案夾下的目錄就明白了。至此,才算完成。
當然,如果要保持命名規範。可以在不改動程式集名稱和命名空間的情況下,只要把area名稱改成如:AspnetMvcArea.Web.Admin也可以。就是前台寫得時候,麻煩了點。
為了書寫上的方便,也可以把area名稱儲存在一個常量裡。
總之一句話:保持area名稱和area項目程式集名稱一致。命名空間可以不一致。
Ps:注意同步修改Routes靜態類下MapAreaRoute方法用到的命名空間參數。
期待下個版本,不用這麼麻煩。