zoukankan      html  css  js  c++  java
  • ASP.NET MVC 路由(四)

    ASP.NET MVC 路由(四)

    前言

    在前面的篇幅中我们解说路由系统在MVC中的执行过程以及粗略的原理,想必看过前面篇幅的朋友应该对路由有个概念性的了解了,本篇来解说区域。在读完本篇后不会肯定的让你对区域有彻底的了解,可是会让你在以后对这部分知识掌握的路上夯上厚实的基础。

     

    区域

    在路由的起初在依照VS环境新建的MVC项目来讲的。今天区域也是依照这种套路来讲。

    MSDN上说,在大型项目使用中被MVC划分为较小单元也就是区域,我没有使用过区域的经验,所以这篇仅仅能解说它的对象模型以及粗略的原理。

    (没有MVC项目的新建一个)首先在MVC项目中,右键项目->加入->区域。然后在弹出的对话框中输入区域的名称,如图

    点击加入后会发如今项目中出现这种文件夹结构,如图:

    临时先无论这些文件夹结构的意思,先来看一下前面篇幅中说到的Global.asax文件里的MvcApplication类的Application_Start()方法中注冊区域的代码:

     

    1 AreaRegistration.RegisterAllAreas();

    RegisterAllAreas()方法就是注冊全部区域的意思。如图所看到的过程:

    在RegisterAllAreas()方法执行的时候内部会依据MVC-AreaRegistrationTypeCache.xml区域缓存文件来读取所缓存的全部区域类型(全部是实现AreaRegistration),假设缓存文件里为空,则会遍历当前系统所依赖的全部程序集搜寻AreaRegistration类型且写入到缓存文件。

    而且返回一个类型集合,此时的类型集合中都是实现了AreaRegistration类型的实现类,在遍历每个类型的时候都会引用传递的把当前系统的路由表RouteTable.Routes传递到新建对象AreaRegistrationContext(參数上下文对象)中。随后再调用基类AreaRegistration的抽象方法RegisterArea(),当然了这是框架中才这么实现的。而在实际情况中此处的基类AreaRegistration已经是上述演示样例中的AreaCaseAreaRegistration类型了。

    到这里我们看一下AreaCaseAreaRegistration类型的内部实现:

     1     public class AreaCaseAreaRegistration : AreaRegistration
     2     {
     3         public override string AreaName
     4         {
     5             get
     6             {
     7                 return "AreaCase";
     8             }
     9         }
    10 
    11         public override void RegisterArea(AreaRegistrationContext context)
    12         {
    13             context.MapRoute(
    14                 "AreaCase_default",
    15                 "AreaCase/{controller}/{action}/{id}",
    16                 new { action = "Index", id = UrlParameter.Optional }
    17             );
    18         }
    19     }

    这里要说的是在RegisterArea()方法中的AreaRegistrationContext类型中的MapRoute()方法并非RouteCollectionExtensions扩展类型中的方法,而是在此外面又包装了一层,此处的MapRoute()方法注冊的路由对象中DataTokens属性值” area”索引下则是次路由所在的区域,也就是区域名称。

    这个时候能够通过调试发现,区域中的路由也和程序中定义的路由一起被注冊到了路由表中,说明区域也就是路由定义在物理文件上的划分,当然还有其他大的作用,本人临时没有领悟到。有感了会第一时间和大家分享。

     

     

     

     

查看全文
  • 相关阅读:
    python虚拟环境--virtualenv
    求导法则和高阶导数
    restful规范
    python协程--yield和yield from
    打印质数
    更改docker的存储位置
    同台ECS安装多个mysql
    jenkins + gitlab + harbor + k8s 部署项目
    jenkins 配置maven
    gitlab + jenkins 持续集成
  • 原文地址:https://www.cnblogs.com/ldxsuanfa/p/10470325.html
  • Copyright © 2011-2022 走看看