asp.net mvc area實現多級controller和多級view


經常需要描述這樣的項目結構

~:.        //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中即可,其他與原來的使用方式沒有任何差別

此處的第二種方式既直掛又簡單快捷,推薦使用

 

記錄下來,留待后查,同時方便他人。

聯系我進行交流。renhanlinbsl@163.com

2017.11.15

15:37


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM