经常需要描述这样的项目结构
~:. //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