經常需要描述這樣的項目結構 ~:. //web根目錄├─.admin //管理員功能目錄│ └─index.html //管理員目錄頁面├─.user //用戶功能目錄│ └─index.html //用戶功能目錄└─index.html //首頁 在普通的mvc之下,我們需要將每個controll ...
經常需要描述這樣的項目結構
~:. //web根目錄
├─.admin //管理員功能目錄
│ └─index.html //管理員目錄頁面
├─.user //用戶功能目錄
│ └─index.html //用戶功能目錄
└─index.html //首頁
在普通的mvc之下,我們需要將每個controller和view都寫在固定的頁面中,這樣所有的文件都堆砌在這兩個目錄中,
對於普通的小型項目,這樣或許是比較方便的解決方案,但需要將項目目錄進行細緻的劃分的時候預設的mvc目錄就
無法實現我們需要的功能了。
一般我們會使用兩種方式來實現
1.通過自定義路由+自定義視圖引擎
2.使用area來對每個目錄進行具體的管理
示例如下:
描述:系統包括三種主要用戶類型,學生、教師、管理員,對於每種用戶的相關功能代碼分類進行整體,便於集中管理也利於
區分其他功能避免文件較多產生歧義
1.通過自定義路由+自定義視圖引擎
首先定義路由規則,在項目目錄下的App_Start/RouteConfig.cs文件中進行配置
1 public static void RegisterRoutes(RouteCollection routes) 2 { 3 routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 4 5 //添加自定義的路由規則 6 routes.MapRoute( 7 //根據約定,需要保證路由名的唯一性 8 name: "teacher", 9 //此處通過添加teacher部分來區分教師的功能頁面 10 url: "teacher/{controller}/{action}/{id}", 11 defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }, 12 //此處由於多個路由規則都使用了名為Home的controller,所以需要 13 //傳入名稱空間來保證控制器的唯一性 14 namespaces:new string[] { "SCMS.Controllers.teacher" }); 15 routes.MapRoute( 16 name: "manager", 17 url: "manager/{controller}/{action}/{id}", 18 defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }, 19 namespaces: new string[] { "SCMS.Controllers.manager" }); 20 routes.MapRoute( 21 name: "admin", 22 url: "admin/{controller}/{action}/{id}", 23 defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }, 24 namespaces: new string[] { "SCMS.Controllers.admin" }); 25 26 //系統定義的路由規則 27 routes.MapRoute( 28 name: "Default", 29 url: "{controller}/{action}/{id}", 30 defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }, 31 namespaces: new string[] { "SCMS.Controllers" }); 32 }
重寫視圖引擎部分
構造如下的一個類,繼承RazorViewEngine類,並重寫ViewLocationFormats的內容
public class ViewEngine : RazorViewEngine { public ViewEngine() { ViewLocationFormats = new[] { "~/Views/{1}/{0}.cshtml", "~/Views/Shared/{0}.cshtml", "~/Views/admin/{1}/{0}.cshtml", "~/Views/teacher/{1}/{0}.cshtml", "~/Views/manager/{1}/{0}.cshtml" }; } }
清除原有的視圖引擎並將重寫的視圖引擎傳入,文件位置為全局Global.asax文件
protected void Application_Start() { AreaRegistration.RegisterAllAreas(); RouteConfig.RegisterRoutes(RouteTable.Routes); //註意此處 ViewEngines.Engines.Clear(); ViewEngines.Engines.Add(new ViewEngine()); }
根據網上教程經過嘗試後發現能夠實現自定義目錄的目的,但是根據此處的view解析目錄,系統預設提供的
解析方式和自定義的解析方式只有一個能保證訪問成果,若有使用不當之處望周知。此處給出一個不算恰當
的解決方案,將直接存放在預設位置的首頁也獨立管理即可。然後去掉"~/Views/{1}/{0}.cshtml"項,加入
"~/Views/Home/{1}/{0}.cshtml"
至此,第一種方式已經結束
2.使用area來對每個目錄進行具體的管理
通過第一種辦法雖能實現我們需要的功能,但是對於功能較多的項目來說對於每一個功能都需要單獨處理,
這樣需要重寫大量的路由規則和view匹配規則,也可能是對mvc的瞭解不夠所以沒發現更好的辦法,這裡
就可以使用area區域來對其目錄結構進行管理,如下
通過右鍵項目目錄新建區域建立區域框架,然後創建瞭如下的目錄結構
C:\USERS\IVES\DESKTOP\SCMS\SCMS\AREAS
├─admin
│ ├─Controllers
│ ├─Models
│ └─Views
│ ├─Home
│ └─Shared
├─manager
│ ├─Controllers
│ ├─Models
│ └─Views
│ └─Shared
└─teacher
├─Controllers
├─Models
└─Views
└─Shared
此處我們可以發現每個區域的目錄結構樹中均包含獨立的MVC的結構,我們只需要將對應的每一個目錄的內容放入對應的區域即可
具體內容見下圖
如圖,我們只需要將原來直接寫在項目路徑下的相關內容直接寫在此處對應area中即可,其他與原來的使用方式沒有任何差別
此處的第二種方式既直掛又簡單快捷,推薦使用
記錄下來,留待後查,同時方便他人。
聯繫我進行交流。[email protected]
2017.11.15
15:37