ASP.NET没有魔法——ASP.NET MVC 直连路由(特性路由)
之前对Controller创建的分析中,知道了Controller的创建是有两个步骤组成,分别是Controller的类型查找以及根据类型创建Controller实例。
在查询Controller的类型时,实际上是通过RouteData中的Controller名称和命名空间来完成匹配和查找的,而Controller的名称就根据路由对象中的url模板来获取,如默认的url模板:"{controller}/{action}/{id}"。以下是根据ControllerName查找Controller类型的方法,需要注意的是,在通过Controller名称查找之前还有一个判断,当RouteData不为空且被匹配为直连路由时,会通过另外的逻辑使用RouteData获取一个Controller类型。代码如下:
DirectRoute是什么?本章将从以下几点介绍直连路由相关内容:
● 什么是直连路由
● 如何在MVC中使用直连路由
● 直连路由与约定路由的区别
● 为什么使用直连路由
什么是直连路由
直连路由又称为特性路由(Attribute Routing),因为它是通过特性的方式将路由的匹配模板直接应用到Action方法上。如下图代码中的action需要使用http://XXX/dr/test才能够正常访问:

其中Route特性的定义如下:

从其定义可以看出Route特性可以应用在Controller以及Action上。通过Route特性可以直接为action指定路由。
那么对于程序来说什么是直连路由呢?从最初给出的代码来看,代码层面是通过RouteData.HasDirectRouteMatch方法来判断的,下图是判断逻辑,非常简单仅仅判断Value中是否包含名称为“MS_DirectRouteMatches”的Key值。换句话说,RouteData中包含“MS_DirectRouteMatches”这个Key值的就是直连路由。

如何在MVC中使用直连路由
ASP.NET MVC中有一个对路由表的拓展对象RouteCollectionAttributeRoutingExtensions,其定义如下图所示,它的功能就是将当前应用中使用特性定义的路由注册到路由表中。

所以在注册路由时加入以下代码即可:

在项目中添加以下测试代码:

运行程序后可以看到dr/test以及dr/test2均被添加到路由表中:

并且在对应的路由信息中包含了Controller和action的信息:

注:此处添加了三条路由信息,其中一条它的值是一个RouteCollectionRoute类型,就是说该路由表又包含了一个路由表,被包含的这个路由表中的内容是该程序中所有通过Route特性生成的,另外的两个LinkGenerationRoute则就表示通过特性生成的路由。换句话说一个特性标记会生成两条路由信息,但为什么一个特性标记会在两个路由表中都插入路由对象本章节不再深入分析。
关于如何在直连路由中使用默认值、路由前缀、默认路由、路由约束、直连路由的Area等功能可参考这篇文章:https://blogs.msdn.microsoft.com/webdev/2013/10/17/attribute-routing-in-asp-net-mvc-5/
直连路由与约定路由的区别
相对于直连路由来说,使用Controller和Action匹配的路由被称为基于约定的路由,因为请求url中携带了约定好的Controller和Action的名称。它们的区别主要有以下几点:
1. 直连路由与约定路由,路由的注册方式不同,前者通过查找所有Controller类型中是否使用Route特性来创建路由。后者通过在配置文件中自行添加。
2. 直连路由在注册时将对应的Controller和Action的信息包含到了Route对象中,而约定的路由是在解析时通过url模板匹配获得Controller和Action信息。
3. 当Action被Route特性标记后,Controller的类型查找不再会通过基于约定的路由的Controller类型查找逻辑。
4. 当Action被Route特性标记后并且项目中使用了基于约定的路由,那么使用基于约定的路由方法是访问不到被标记的action的,因为查找Action的逻辑中它们两种路由是分开的:

5. 直连路由请求中的RouteData自动添加了MS_DirectRoute相关的值,如下:

为什么使用直连路由
直连路由最主要的特性就是路由与实际代码在同一个文件里,这样在代码阅读时更容易将路由与实际的Action进行匹配,另外使用直连路由可以根据实际的需求来“创造”一个更符合需求的url“新约定”,同时也可以避免基于约定的路由对代码内部实现的暴露。
小结
本章通过在MVC的源码中发现两种不同的Controller、Action处理方式引出了直连路由的概念,实际上这是MVC5中加入的新特性,可以使用特性的方式指定对应的action的路由模板。但要注意的是尽量避免两种路由方式的混用造成代码混乱。
参考:
https://blogs.msdn.microsoft.com/webdev/2013/10/17/attribute-routing-in-asp-net-mvc-5/
本文链接:http://www.cnblogs.com/selimsong/p/7722988.html
ASP.NET没有魔法——ASP.NET MVC 直连路由(特性路由)的更多相关文章
- ASP.NET没有魔法——ASP.NET MVC 与数据库大集合
ASP.NET没有魔法——ASP.NET与数据库 ASP.NET没有魔法——ASP.NET MVC 与数据库之MySQL ASP.NET没有魔法——ASP.NET MVC 与数据库之ORM ASP.N ...
- ASP.NET没有魔法——ASP.NET MVC 路由的匹配与处理
ASP.NET MVC的路由是MVC应用的一个核心也是MVC应用处理的入口,作为一个开发者,在正常情况下仅仅需要做的就是根据需求去定义实体.业务逻辑,然后在MVC的Controller中去调用.Vie ...
- ASP.NET没有魔法——ASP.NET MVC IoC
之前的文章介绍了MVC如何通过ControllerFactory及ControllerActivator创建Controller,而Controller又是如何通过ControllerBase这个模板 ...
- ASP.NET没有魔法——ASP.NET MVC 过滤器(Filter)
上一篇文章介绍了使用Authorize特性实现了ASP.NET MVC中针对Controller或者Action的授权功能,实际上这个特性是MVC功能的一部分,被称为过滤器(Filter),它是一种面 ...
- ASP.NET没有魔法——ASP.NET MVC使用Oauth2.0实现身份验证
随着软件的不断发展,出现了更多的身份验证使用场景,除了典型的服务器与客户端之间的身份验证外还有,如服务与服务之间的(如微服务架构).服务器与多种客户端的(如PC.移动.Web等),甚至还有需要以服务的 ...
- ASP.NET没有魔法——ASP.NET MVC 模型绑定解析(下篇)
上一篇<ASP.NET没有魔法——ASP.NET MVC 模型绑定解析(上篇)>文章介绍了ASP.NET MVC模型绑定的相关组件和概念,本章将介绍Controller在执行时是如何通过这 ...
- ASP.NET没有魔法——ASP.NET MVC Razor与View渲染
对于Web应用来说,它的界面是由浏览器根据HTML代码及其引用的相关资源进行渲染后展示给用户的结果,换句话说Web应用的界面呈现工作是由浏览器完成的,Web应用的原理是通过Http协议从服务器上获取到 ...
- ASP.NET没有魔法——ASP.NET MVC Razor与View渲染 ASP.NET没有魔法——ASP.NET MVC界面美化及使用Bundle完成静态资源管理
ASP.NET没有魔法——ASP.NET MVC Razor与View渲染 对于Web应用来说,它的界面是由浏览器根据HTML代码及其引用的相关资源进行渲染后展示给用户的结果,换句话说Web应用的 ...
- ASP.NET没有魔法——ASP.NET 身份验证与Identity
前面的文章中为My Blog加入了文章的管理功能(ASP.NET没有魔法——ASP.NET MVC使用Area开发一个管理模块),但是管理功能应该只能由“作者”来访问,那么要如何控制用户的访问权限?也 ...
- ASP.NET没有魔法——ASP.NET Identity 的“多重”身份验证
ASP.NET Identity除了提供基于Cookie的身份验证外,还提供了一些高级功能,如多次输入错误账户信息后会锁定用户禁止登录.集成第三方验证.账户的二次验证等,并且ASP.NET MVC的默 ...
随机推荐
- Java :构造器中的显式参数和this隐式参数
1.构造器 写一个Java类,首先要先从构造器开始,构造器与类同名,在构造类的对象时会先从构造器开始. 构造器总是伴随着new操作符的执行而被调用. 构造器主要是用来初始化类的实例域. 构造器的特点: ...
- mysql5.6.24的安装与简单使用
1, 下载绿色版Mysql5.6.24 http://dlsw.baidu.com/sw-search-sp/soft/ea/12585/mysql-5.6.24-win32.1432006610.z ...
- JSR303的数据校验-Hibernate Validator方式实现
1.什么是JSR303? JSR303是java为bean数据合法性校验所提供的一个标准规范,叫做Bean Validation. Bean Validation是一个运行时的数据校验框架,在验证之后 ...
- jmeter按比例执行业务场景
可用函数 __counter实现: 函数助手中 找到 __counter,如 ${__counter(false,num)},功能简介 ---- 参数为true,每个用户有自己的计数器 ---- 参数 ...
- oracle pl/sql 包
包用于在逻辑上组合过程和函数,它由包规范和包体两部分组成.1).我们可以使用create package命令来创建包,如:i.创建一个包sp_packageii.声明该包有一个过程update_sal ...
- 开博近一年的感想 by 程序员小白
/* 好吧,这里的写博客应该理解为更宏观的写文章. */ 在去年的这个时候,我所知道的平台只有 CSDN 和博客园..然而 CSDN 的广告实在是不想吐槽了,选择博客园是一件非常自然的事情.要说开 ...
- [js高手之路] html5 canvas系列教程 - 线形渐变,径向渐变与阴影设置
接着上文[js高手之路] html5 canvas系列教程 - 像素操作(反色,黑白,亮度,复古,蒙版,透明)继续. 一.线形渐变 线形渐变指的是一条直线上发生的渐变. 用法: var linear ...
- hive参数配置
CLI参数 两种修改方式: 1)启动时 hive --hiveconf hive.cli.print.current.db=true 2)修改当前用户home目录下 .hiverc文件,hive c ...
- tcpip第三章
1,ip协议不可靠.无连接特性介绍 不可靠:计算机A往计算机B发送数据报1,若途径的路由器缓存已满,或者ttl(time to live 生存周期)到了,则路由器直接丢弃数据包1,并产生icmp数据包 ...
- Entity Framework Code First实现乐观并发
Entity Framework Code First实现乐观并发 不定时更新翻译系列,此系列更新毫无时间规律,文笔菜翻译菜求各位看官老爷们轻喷,如觉得我翻译有问题请挪步原博客地址 本博文翻译自: h ...