背景资料:
随着业务的需要,结构需求越来越多,View文件夹下的文件夹也越来越多,又或者需要更改结构的页面路径,另外可能是多个人合作开发,有多个WEB项目需要合并在一个网站中访问。
用Areas可以解决上述问题,在项目中新建一个区域,就好像应用了另外一个项目一样,可以理解为当前项目的子项目,其本质就是一个子文件夹。就好比使用Area之前是把所有的文件夹放到一个文件夹中,使用了Area就相当于使用了子文件夹来进行管理,这样,Areas就可以将复杂的网站模板化,有利于页面的规范。
但是Areas又带来了另外一个问题:在同一个解决方案中使用多个Area,会造成程序的耦合性大大增加,当多个开发人员合作的时候,由于开发人员的能力参差不齐,经常会产生一个Area中的某个功能修改后,影响到了另一个Area,而且项目编译后,bin目录下只会产生一个此项目本身的DLL,这样是非常不好的。如果能将某些Area分离出来自成一个项目,单独进行修改,单独对其更新DLL,那就太棒了!本文就是要用简单的案例演示这个功能。
新建一个MVC项目,并且增加一个区域,命名为Report,如下图所示:
在Report区域中随便加个Control , View ,Model,反正是用来测试的,我添加的功能十分简单,就是在页面上显示一串字符串而已,如下图所示:
Model中的代码如下图所示:
Control中的代码如下图所示:
View中的代码如下图所示:
因为功能比较简单,在浏览器中输入路由路径,功能显示没有问题,如下图所示:
接下去我要将Report区域分离出来,首先,再新建一个MVC项目,命名为Report,如下图所示:
删除Report区域中其他文件,并且将WebApplication中Report区域下的ReportAreaRegistration文件复制到Report项目中,并去掉路由注册的代码,重复的路由注册会报错 ,Report项目的目录如下图所示:
ReportAreaRegistration.cs文件中的代码如下图所示:
将 WebApplication中Report区域下的Control文件和Model文件剪切到 Report中,View文件不需要剪切,如下图所示:
修改OneViewModel中的命名空间,如下图所示:
修改ReportOneControl中对OneViewMode引用的命名空间,如下图所示:
修改OneView中对OneViewModel引用的命名空间,如下图所示:
重新编译Report项目生成Report.dll后, WebApplication1项目引用Report.dll,如下图所示:
到这里已经完成了,Report相关的model 和 control代码已经剥离了,运行后结果和原来一样:
至于 AreaRegistration 的原理,目前还在研究中,感觉路由是跟命名空间有关系的,只要在同一命名空间下Control,即便被剥离出源项目,还是能引用到的。以下是摘抄来的一段话:AreaRegistration类型会将其所在的命名空间保存在DataTokens["Namespaces"]中,在接收请求的时候就只会在这些命名空间或子空间中寻找controller,如果命名空间写错了,当然就无法识别了。因此实际上area注册仅仅起到的作用是,将area的名字和命名空间关联起来。因此如果要导航area中的controller必须首先提供area名字,这样就不会找到其他命名空间下的controller了,它必须先去找你的area名字,它的机制是这样的。