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”索引下则是次路由所在的区域,也就是区域名称。

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

ASP.NET MVC路由的更多相关文章

  1. ASP.NET MVC 路由(一)

    ASP.NET MVC路由(一) 前言 从这一章开始,我们即将进入MVC的世界,在学习MVC的过程中在网上搜索了一下,资料还是蛮多的,只不过对于我这样的初学者来看还是有点难度,自己就想看到有一篇引导性 ...

  2. ASP.NET MVC 路由(二)

     ASP.NET MVC路由(二) 前言 在上一篇中,提及了Route.RouteCollection对象的一些信息,以及它们的结构所对应的关系.按照处理流程走下来还有遗留的疑问没有解决这个篇幅就来讲 ...

  3. ASP.NET MVC 路由(三)

    ASP.NET MVC路由(三) 前言 通过前两篇的学习会对路由系统会有一个初步的了解,并且对路由系统中的Url规则有个简单的了解,在大家的脑海中也有个印象了,那么路由系统在ASP.NETMVC中所处 ...

  4. ASP.NET MVC 路由(四)

    ASP.NET MVC路由(四) 前言 在前面的篇幅中我们讲解路由系统在MVC中的运行过程以及粗略的原理,想必看过前面篇幅的朋友应该对路由有个概念性的了解了,本篇来讲解区域,在读完本篇后不会肯定的让你 ...

  5. ASP.NET MVC 路由(五)

    ASP.NET MVC 路由(五) 前言 前面的篇幅讲解了MVC中的路由系统,只是大概的一个实现流程,让大家更清晰路由系统在MVC中所做的以及所在的位置,通过模糊的概念描述.思维导图没法让您看到路由的 ...

  6. Asp.Net MVC 路由 - Asp.Net 编程 - 张子阳

    http://cache.baiducontent.com/c?m=9d78d513d98316fa03acd2294d01d6165909c7256b96c4523f8a9c12d522195646 ...

  7. AngularJS html5Mode与ASP.NET MVC路由

    AngularJS html5Mode与ASP.NET MVC路由共存 前言 很久之前便听说AngularJS,非常酷,最近也比较火,我也在持续关注这个技术,只是没有认真投入学习.前不久公司找我们部门 ...

  8. Asp.Net MVC路由调试好帮手RouteDebugger

    Asp.Net MVC路由调试好帮手RouteDebugger 1.获取方式 第一种方法: 在程序包控制台中执行命令 PM> Install-Package routedebugger 安装成功 ...

  9. ASP.NET MVC路由(5)

    ASP.NET MVC路由(五) 前言 前面的篇幅讲解了MVC中的路由系统,只是大概的一个实现流程,让大家更清晰路由系统在MVC中所做的以及所在的位置,通过模糊的概念描述.思维导图没法让您看到路由的实 ...

随机推荐

  1. krpano漫游加方向性3D声音(这篇文章已被移到krpano中国网站 krpano360.com)

    需求:      在场景转换视角时.会出现不同方位的声音以及对应的音量变化,也即是将声音视作hotspot.当视角转到该声音热点时,也随之听到声音.官方样例:点击打开链接 本文已经搬迁到下述网址.请点 ...

  2. 微软发布Win10开发者指南视频

    假设你是一个开发者,推荐你看看微软今天推出了一系列视频,标题是Win10开发人员指南,总体长度6时,多达22章内容,介绍很广泛.其实,即使你是编程新手或仅有兴趣,也值得一看. 开发人员Jerry Ni ...

  3. linux文章(11)---umask和chmod

    一.用途 文将介绍linux环境下有关文件訪问模式相关的命令.         umask用来设置默认的文件訪问模式屏蔽值:chmod用来改动文件的訪问模式.         本文将选取ubuntu1 ...

  4. 计数排序(C语言版本)

    让我们来谈谈数的排序思维: 计数排序假定待排序的全部元素都是介于0到K之间的整数.计数排序使用一个额外的数组countArray.当中第i个元素是待排序数组array中值等于i的元素的个数.然后依据数 ...

  5. Android 内存管理 &Memory Leak & OOM 分析

    1.Android 流程管理&内存 Android主要应用在嵌入式设备其中.而嵌入式设备因为一些众所周知的条件限制,通常都不会有非常高的配置,特别是内存是比較有限的. 假设我们编写的代 码其中 ...

  6. RQNOJ PID3 / Jam的计数法

    题目描述 Jam是个喜欢标新立异的科学怪人.他不使用阿拉伯数字计数,而是使用小写英文字母计数,他觉得这样做,会使世界更加丰富多彩.在他的计数法中,每个数字的位数都是相同的(使用相同个数的字母),英文字 ...

  7. bigdata_批量机器执行通用脚本

    经常有这样的场景,需要批量验证一些配置或者机器,执行一些命令.例如  echo $PATH  等等 这里分享一个批量执行脚本 脚本名称 deployCommnd.sh 运行demo : sh depl ...

  8. ClassLoader—流程观察程序执行类加载-verbose:class

    当调试器,有时你需要看到程序加载的类.记忆的恢复情况.本地接口调用,等等..这时候就需要-verbose命令. 在myeclipse能够通过右键设置(例如以下).也能够在命令行输入java -verb ...

  9. hdu What Are You Talking About(map)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1075 map简单应用 代码: #include <stdio.h> #include &l ...

  10. Hibernate_10_继承的例子_单表

     只是建一个表,所有属性都包括在此表.使用discriminator 到父和子类之间的区别. 1)父类(Article): public class Article { private Integer ...