首页 > 代码库 > MVC之Area相关技术

MVC之Area相关技术

 

 当在做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的程序集中即可,这样就可以找到我们的控制器。


     

   




















MVC之Area相关技术