ASP.NET MVC Area区域

Area 区域的做用

  在生活中一样也有区域的概念,如大型的酒店会将厨师根据不一样的菜系开设专门独立的档口烹饪本身擅长的菜系。同理在MVC网站开发中咱们也能够经过区域来独立划分不一样的模块。如某些网站分前台(面向用户)和后台(面向管理员),此状况就能够使用区域进行划分独立。还例如能够将大型项目中包含订单、CRM、权限,均可使用“Area 区域”进行独立。服务器

  在使用了ASP.NET Area 区域后,每一个区域中的目录结构就至关于一个简版的ASP.NET MVC目录结构。工具


 添加Area区域

  在点击“区域”菜单后会在项目的根目录自动建立一个Areas文件夹,Areas文件夹下每一个文件夹就是自定义名称的区域文件夹,区域文件夹目录结构就至关于一个简版ASP.NET MVC的结构。网站

  Areas区域结构如图:url

  使用“Areas 区域”可利于开发的协同,每一个开发者只用关注本身负责的区域模块,在代码提交到版本库时可减小冲突。spa

  另外,若是项目决定使用了“Areas 区域”来规划结构,那么根目录的Controllers、Views、Models目录能够根据实际状况进行忽略。3d


 Areas区域的路由

  咱们知道请求一个ASP.NET MVC的页面到服务器,服务器会根据RouteConfig中的路由规则和URL进行匹配解析,获取到对应的Controller并执行Action。那么在项目中使用了“Areas区域”后,ASP.NET MVC是如何去解析对应的页面请求规则呢?是会和站点根目录的Controller共用RouteConfig里的路由规则吗?下面就对以上的问题进行一个分析解读。调试

 

Areas区域注册文件

  在建立“Areas 区域”后,区域的根目录会自动建立一个以“区域名+AreaRegistration”命名的类,而且该类继承之AreaRegistration类。类的结构参考图以下:对象

 

RegisterArea方法

  RegisterArea方法的做用就是将针对当前“Areas 区域”的路由规则进行一个注册,最终注册到项目的路由集合中。而且其中的name和url属性都加入了区域名称做为一个区分的标识。blog

路由注册的顺序

  对于“Areas 区域”中的路由规则在ASP.NET MVC的注册顺序排列上是要优先于“网站级”的路由规则(RouteConfig文件),这个能够从“Global.asax”文件中的Application_Start方法中能够看出,“Areas 区域”的注册代码会在RouteConfig注册的上层。继承

   其中这个路由的注册顺序原则上是不能进行倒置的,由于若是“网站级”的路由规则的顺序靠前的话,则路由匹配时会致使逻辑错误,例如本来的区域标识被做为Controller去匹配,本来的Controller则会做为Action匹配。

 

RouteDebugger工具

在ASP.NET MVC中有一种能够进行路由规则分析的工具就是RouteDebugger。

使用方式:

1.在MVC项目中引用RouteDebugger.dll文件。

2.在Web.config中新增节点  <add key="RouteDebugger:Enabled" value="true" />

 程序集下载

连接:https://pan.baidu.com/s/13bRI5YLPRZtNr6IAsrOTTg

提取码:ppdo 

 

使用路由规则调试器(RouteDebugger)来看看正常顺序下路由匹配的结果:

从图中能够看出“Areas 区域”匹配是在最前列的,而且成功的解析到区域信息。

 

使用路由规则调试器(RouteDebugger)来看看颠倒顺序(RouteConfig注册放在区域路由的前面)后的路由匹配结果:

 

结果:

 错误缘由分析:因为颠倒了“Areas 区域”和“RouteConfig”的注册顺序,从而致使Areas 区域的请求URL去匹配“网站级别”的路由,出现了错误的逻辑解析。可能有人会有疑问,图中匹配了多个True的路由规则,为何会执行失败?这是由于在路由匹配时若是发现URL和路由集合中某条是能够匹配的,则会中断后续的路由规则匹配,也就是说只会执行第一条True的路由规则解析,全部后续有匹配的它也不会去解析。

 

AreaRegistration.RegisterAllAreas()的注册原理

  RegisterAllAreas方法是专门为“Areas 区域”进行路由规则的注册的,该方法会查找当前网站bin目录下全部继承了AreaRegistration类的子类,而后建立子类对象并调用每一个子类中的RegisterArea方法,完成当前网站中全部路由规则注册的工做。

  区域路由注册流程图:

 

AreaName属性

顾名思义“区域名称”,其主要目的是告诉视图引擎在哪一个区域文件夹下找到相应的视图文件,至关于一个标识的做用,用来区分项目中不一样的区域。


 Areas 区域中的Web.config

  咱们能够发如今“Areas 区域”的Views文件夹根目录下都有一个独立的Web.config文件。其中缘由是:由于每一个视图在编译事后会生成一个视图类,而且这个类是派生自WebViewPage类,而“Areas 区域”中的这个Web.config文件就是告诉视图引擎关于视图类的继承关系和一些列所依赖的配置信息,主要明确指出视图类的基类。

  注意:基于上述的依赖关系,因此咱们不能删除掉“Areas 区域”中的Web.config文件,删除后会有以下的错误出现:


 将Areas 区域中的控制器单独分离到一个类库中

示例操做以下:

  1. 新建类库,并将控制器移植到类库,并修改其命名空间,而后添加引用MVC命名空间。

 2.在ASP.NET MVC项目中引用独立的控制器类库的程序集。

3.将ASP.NET MVC项目中的AreaRegistration文件移植到独立的控制器类库中,并修改其命名空间,而后添加引用System.Web命名空间。

 

 最终演示结果: