Area--->AreaRegistrationContext.MapRoute
文章引导
Area--->AreaRegister.RegisterAllArea()与Area区域的解析
引言:
学习本文建议先看下另一篇文章(Area--->AreaRegister.RegisterAllArea()与Area区域的解析),此篇文章着重解析AreaRegistrationContext.MapRoute函数。
一.先从MapRoute说起
接着上一篇文章的末尾进行阐述,上一篇文章的末尾为:
Area的注册过程的第一步先找到所有继承或实现AreaRegistration类的类并序列化之后保存进缓存文件。接着才是重头戏(MapRoute)进行路由注册。
在AreaRegistrationContext中同样存在同名的MapRoute函数。
public Route MapRoute(string name, string url, string[] namespaces)
{
return this.MapRoute(name, url, null, namespaces);
} public Route MapRoute(string name, string url, object defaults, object constraints)
{
return this.MapRoute(name, url, defaults, constraints, null);
} public Route MapRoute(string name, string url, object defaults, string[] namespaces)
{
return this.MapRoute(name, url, defaults, null, namespaces);
} public Route MapRoute(string name, string url, object defaults, object constraints, string[] namespaces)
{
if ((namespaces == null) && (this.Namespaces != null))
{
namespaces = this.Namespaces.ToArray<string>();
}
Route route1 = this.Routes.MapRoute(name, url, defaults, constraints, namespaces);
route1.DataTokens["area"] = this.AreaName;
bool flag = (namespaces == null) || (namespaces.Length == );
route1.DataTokens["UseNamespaceFallback"] = flag;
return route1;
}
在上部代码中可以看到,整个代码的核心最终还是引用的Routes.MapRoute进行路由的注册。
二.Routes.MapRoute
Routes就是一个RouteCollection,此处的Routes还需要追溯到上一篇文章
下面为AreaRegistrationContext的构造函数,通过构造函数完成This.Routes的初始化赋值。
public AreaRegistrationContext(string areaName, RouteCollection routes, object state)
{
this._namespaces = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
if (string.IsNullOrEmpty(areaName))
{
throw System.Web.Mvc.Error.ParameterCannotBeNullOrEmpty("areaName");
}
if (routes == null)
{
throw new ArgumentNullException("routes");
}
this.AreaName = areaName;
this.Routes = routes;
this.State = state;
}
我们接着来看Routes.MapRoute的代码
上面代码实例化一个Route并对属性进行赋值,其中Constraints和DataTokens值都一样,都是new RouteValueDictionary()。由于route.Constraints为空,则ConstraintValidation.Validate(route)不会运行函数内部代码。此扩展函数最后将信息Add进当前Routes,并返回路由信息route。
最后对Routes.DataTokens(RouteValueDictionary)添加信息,并返回Route。
三.总结
针对某个Area的路由映射是通过相应的AreaRegistration进行注册的,具体来说是在AreaRegistration的RegisterArea方法中调用AreaRegistrationContext对象的MapRoute方法进行注册的。如果在调用MapRoute方法中指定了表示命名空间的字符串,将自动作为注册的路由对象的命名空间,否则会将表示AreaRegistration所在命名空间的字符串加上"."后缀作为路由对象的命名空间。
这里说的路由对象的命名空间指的是通过Route对象的DataTokens属性表示的RouteValueDictionary对象中Key为Namespaces的字符串数组,而该字符串最终会转移到生成的RouteData的DataTokens中。
除此之外,在调用AareaRegistrationContext的MapRoute方法时,还会在注册Route对象DataTokens中添加一个Key为UseNamespaceFallback的条目表示是否采用后背命名空间 对Controller进行解析。如果注册对象具有命名控件(调用MapRoute方法时指定了命名空间或对应的AreaRegistration类型定义在某个命名空间中),该条目值为false。
在解析Controller类型过程中,会先通过RouteData包含的命名空间来解析Controller类型。如果Controller类型解析失败,则通过包含RouteData的DataTokens属性key为useNamespaceFallback值来判断是否使用后背命名空间来进行解析。如果为true,则通过当前ControllerBuilder的命名空间解析,如果失败则忽略命名空间直接采用类型名称进行匹配,否则直接抛出异常。
Area--->AreaRegistrationContext.MapRoute的更多相关文章
- 如何将 Area 中的 Controller 放到独立的程序集?
目录 背景如何将 Area 中的 Controller 放到独立的程序集?备注 背景返回目录 本文假设您已经熟悉了 ASP.NET MVC 的常规开发方式.执行模型和关键扩展点,这里主要说一下如何使用 ...
- ASP.NET MVC:看 MVC 源码,学习:如何将 Area 中的 Controller 放到独立的程序集?
背景 本文假设您已经熟悉了 ASP.NET MVC 的常规开发方式.执行模型和关键扩展点,这里主要说一下如何使用 ASP.NET MVC 的源代码解决一些问题. 如何将 Area 中的 Control ...
- Area--->AreaRegister.RegisterAllArea()与Area区域的解析
文章引导 MVC路由解析---IgnoreRoute MVC路由解析---MapRoute MVC路由解析---UrlRoutingModule Area的使用 Area--->AreaRegi ...
- (转)ASP.NET Mvc 2.0 - 1. Areas的创建与执行
转自:http://www.cnblogs.com/terrysun/archive/2010/04/13/1711218.html ASP.NET Mvc 2.0 - 1. Areas的创建与执行 ...
- [转]深入ASP.NET MVC之二:路由模块如何工作
本文转自:http://www.cnblogs.com/yinzixin/archive/2012/11/05/2754483.html 摘要: 上文分析了UrlRouting模块何时会被触发,本文重 ...
- 第二十一节:Asp.Net Core MVC和WebApi路由规则的总结和对比
一. Core Mvc 1.传统路由 Core MVC中,默认会在 Startup类→Configure方法→UseMvc方法中,会有默认路由:routes.MapRoute("defaul ...
- 把旧系统迁移到.Net Core 2.0 日记(6) MapRoute/Area/ViewPath
我想实现 http://localhost:5000/{moduleName}/{controller}/{action}/{id?} 这样的url. 有2个方法 方法1: 在路由里设置多个modul ...
- ASP.NET MVC系列:Area
1. Area简介 ASP.NET MVC Area机制构建项目,可以将相对独立的功能模块切割划分,降低项目的耦合度. 2. Area设置Routing 新建Admin Area后,自动创建Admin ...
- MVC 添加Area
在MVC项目中经常会使用到Area来分开不同的模块让项目结构更加的清晰. 步骤如下: 项目 –> 添加 -> 区域 ( Area ) 输入 Admin 添加成功后 Area包含: 创建一个 ...
随机推荐
- Spring Cloud Alibaba 从孵化到 "挂牌" 之旅
背景 2014 年,Spring Boot 1.0 发布.Spring Boot 的发布绝对是 Pivotal 历史上具有里程碑意义的事件,它让我们能够非常简便地开发 Spring 应用,屏蔽了各种配 ...
- JSTL标签的用法详解
在JSP中写Java代码是一件很恶心的事情,代码量少的话还可以,要是多的话,就蛋疼了,整个页面都是<% %>所以EL表达式和JSTL就应运而生了,这里我们注重讲解一下JSTL标签的使用: ...
- 对称性——cf405d
以后碰到这种题就应该往对称性想:设x的对称数x‘是1e6-x+1 对于任意一组对称数x+x'-2=1e6-1,2e6-(x+x')=1e6-1,即X集合Y集合同时加上任意一组对称数都是可以的 枚举每个 ...
- springboot之停止与启动服务的脚本
最近要开始自动化部署了,我们要编写杀死服务的脚本. 我在windows写好的脚本拷贝到linux,就是不行,好像是因为转义字符吧. 然后,我就手敲了这个下面脚本: pid=`ps -ef|grep / ...
- NX二次开发-Block UI C++界面Specify Point(指定点)控件的获取(持续补充)
Specify Point(指定点)控件的获取 NX9+VS2012 #include <uf.h> #include <uf_ui.h> UF_initialize(); / ...
- 前台页面中json和字符串相互转化
比如我有两个变量,我要将a转换成字符串,将b转换成JSON对象: var a={"name":"tom","sex":"男&quo ...
- 24、echarts做报表
1.今天就来讲一讲echarts的使用 使用步骤 (1)首先需要下载包echarts.js,然后引入该包, <!DOCTYPE html> <html> <header& ...
- SVN工作副本已经锁定错误的解决方法
SVN工作副本锁定错误的解决方法 我们在使用svn版本控制软件时,时常会遇到想要更新本地项目的版本,却突然提示:工作副本已锁定.截图如下: 这种错误让人感觉很不舒服,实际上自己也没做过什么操作就这样了 ...
- 7. Jmeter-逻辑控制器介绍与使用
逻辑控制器介绍与使用 如果(if)控制器 事物控制器 循环控制器 while controller critical section controller foreach控制器 include con ...
- react 中刷新,路由传参数丢失不存在了?
你可能在Link to没写state {{pathname:'/report',state:{storageClear:this.state.storageClear}}}