当在做MVC大型网站时,我们通常会切割成多个模块。但又由于在MVC中如果有Controller名字相同的话,会出错,那如何来解决这个问题呢?微软太人性化了,看下文。
1.新增区域
1)添加区域
2)设置区域名称
3)最后显示
2.默认路由与区域路由的优先级。
我们在打开Global.asax,如下所示
<span style="font-size:18px;"> public class MvcApplication : System.Web.HttpApplication { protected void Application_Start() { //注册全部的区域路由 AreaRegistration.RegisterAllAreas(); WebApiConfig.Register(GlobalConfiguration.Configuration); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); //注册路由 RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); } }</span>
其中第一行就是我们的区域路由注册进RouteTable.Routes,正所谓“先注册先赢”,所以我们已经在区域的OrderAreaRegistration.cs定义了某个网址路由。相应的如果两个注册机制交换顺序的画,就会先比对默认的路由。
<span style="font-size:18px;"> public class OrderAreaRegistration : AreaRegistration { public override string AreaName { //对应的路由的地址文件名称 get { return "Order"; } } public override void RegisterArea(AreaRegistrationContext context) { //路由的比对规则 context.MapRoute( "Order_default", "Order/{controller}/{action}/{id}", new { action = "Index", id = UrlParameter.Optional } ); } }</span>
3.即使使用了区域,仍然可能存在名称冲突
比如在两种路由机制中有了相同的名称话,有时也可能出现冲突,解决办法如下,给指定的路由传入相应的namespace。当指定了命名空间后,MVC就不再会搜索整个网站的类别来寻找Controller,而是利用指定的命名空间去寻找。
<span style="font-size:18px;">public override void RegisterArea(AreaRegistrationContext context) { //路由的比对规则 context.MapRoute( "Order_default", "Order/{controller}/{action}/{id}", new { action = "Index", id = UrlParameter.Optional }, //指定相应的命名空间,因此寻找路由的时候,就不会在发生冲突了 namespaces: new string[1] { "MvcApplication1.Areas.Order" } ); }</span>
4.路由的高级特性
我们在做开发的时候,如何才能把控制器单独抽离出来来管理呢?什么意思呢?让MVC框架中的Controller来自于一个独自的类来管理,这样方便管理。那么先来了解一下MVC中视图的机制吧!
1.视图机制
分析:我们在上面已经知道MVC的程序入口是Global.asax类下的Application_Start方法,在这里会先注册全部的路由机制,因此当注册完区域路由和默认的路由后,就会去比对发过来的Http请求。此时就会去程序集也就是bin文件下找名字以controller结尾的,并且继承了Controller类的文件,找到后就会采取其中的路由规则一一比对。因此利用这个特性,我们可以单独建立一个类库,然后建立相应的以Controller的类,只不过让程序最终编译进MVC的程序集中即可,这样就可以找到我们的控制器。