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的默 ...
随机推荐
- 201521123051 《Java程序设计》 第二周学习总结
1. 本周学习总结 1.学会使用码云:学会如何将项目同步到码云中以及从码云上的项目保存到本地. 2.各数据类型的使用. 3.运算符和表达式的使用. 4.string创建之后不可在修改. 5.Java程 ...
- 201521123017 《Java程序设计》第13周学习总结
1. 本周学习总结 2. 书面作业 Q1.网络基础 1.1 比较ping www.baidu.com与ping cec.jmu.edu.cn,分析返回结果有何不同?为什么会有这样的不同? 1.2 te ...
- 201521123059 《Java程序设计》第十四周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多数据库相关内容. 1.关系型数据库 --建立表格时表中一列中的数据类型必须一致.关系表中的行必须是唯一的,列是不可分的,某些行的某 ...
- 参加IMWebConf 2017 前端开发者大会是什么体验?
周六作为特邀讲师之一参加了IMWebConf 2017 前端开发者大会的主题演讲,主题为<WebAssembly:面向未来的web开发技术>.本次大会质量非常高,来自国内外的技术专家带了很 ...
- Java并发之synchronized关键字
上篇文章我们主要介绍了并发的基本思想以及线程的基本知识,通过多线程我们可以实现对计算机资源的充分利用,但是在最后我们也说明了多线程给程序带来的两种典型的问题,针对它们,synchronize ...
- JSP第六篇【自定义标签之传统标签】
为什么要使用自定义标签? JSTL标签库只提供了简单的输出等功能,没有实现任何的HTML代码封装,并且某些复杂类型转换,或者逻辑处理的时候,JSTL标签库完成不了,需要自定义标签! 编写自定义标签的步 ...
- Extjs整合CKEditor富文本编辑器插件
CKEditor插件官方下载地址: http://ckeditor.com/download/releases 我使用的版本是 ExtJS5.1.0 CKEditor4.4.8 参考文章: http ...
- 鸟哥Linux学习笔记03
1, 在Linux中,默认情况下所有的系统上的账号都记录在/etc/passwd这个文件内,密码记录在/etc/shadow这个文件下,所有的组名都记录在/etc/group内,这三个文件可以说是Li ...
- hibernate中Query的list和iterator区别(续)
打开cache后query的list和iterator方法区别 将query 的cache打开的话,缓存的是query本身,以hql 生成的 sql ,再加上参数,分页等信息做为key值,而不是que ...
- 每天学点SpringMVC-拦截器
1. 先写个Hello World 1.1 写一个Interceptor class并实现HandlerInterceptor接口 public class FirstInterceptor impl ...