Asp.Net MVC路由生成URL过程
这次谈一谈Asp.Net MVC中所学到的路由生成URL的相关技术,顺便提一提遇到的一些坑,真的是掉坑掉多了,也就习以为常了,大不了从坑里再爬出来。初学者,包括我,都以为,mvc的核心是模型视图控制器,其余都是辅助,但是路由却也是可以独立成一个角色的。从ASP.NET发展来,路由已从一个小小角色演变成了独立的一方了,所以这个认识必须打破原有建立的思想。
首先得知道一个概念,路由的功能是什么? 简单的讲就是你拿给我一个地址,我通过路由来查询一下,然后转交给你结果,路由好比一个服务区,确实如此,MVC中,当用户提交一个请求URL,MVC中的URL和其它Web中的是有点区别的,此处的统一资源定位符更多的是侧重于某个控制器类上的某个操作,和磁盘上的资源打的交道是比较少的。服务器上接收到请求URL后,交由路由系统进行处理,通过查询已经注册的路由信息,查看是否有该URL请求,如果有,则进行相应的逻辑操作处理,最终返回需要的HTML和URL,如果找不到URL,那么进入默认页面,或者是直接报错。
具体的细节在谈一谈:路由的核心是一些非常简单的算法,基于一个由RouteCollection类和RouteBase类组成的简单抽象对象。通过使用RouteCollection.GetVirtualPath()方法来处理相关逻辑并最终生成URL,
public VirtualPathData GetVirtualPath(RequestContext requestContext,RouteValueDictionary values);
public VirtualPathData GetVirtualPath(RequestContext requestContext,string name,RouteValueDictionary values);
路由集合通过这些方法遍历每一个路由并通过已有参数匹配是否能生成URL,如果有路由应答了,那么它就返回一个包含了URL的VirtualPathData实例以及其它信息,没有就返回一个空值,并查询下一个路由
如果有利用第二个重载方法的,那么更加简单了,不需要一个一个匹配,直接通过name参数,该参数是路由名称的字符串,可以直接匹配路由集合中该路由名称,一句话说就是直接定位,找到了并符合就生成URL,返回空值就不再匹配其它路由了。
URL生成详解:
1.通过RouteCollection.GetVirtualPath()方法,将RequestContext对象,一个包含值的字典,以及用来选择生成URL的路由名称传入方法中。
2.路由机制查看要求的路由参数,这个参数是必须要存在的参数,并确保提供的路由值字典为每一个必须存在的参数提供了一个值,否则直接返回空值。
3.一些路由可能包含没有对应路由参数的默认值,如果用户传入的路由值字典中提供了这个参数,并且提供了值,那么这个字典中的值必须和默认参数中给定的值相匹配,不然就返回空值。
4.然后路由系统应用路由的约束,检查是否符合。
5.匹配成功,尝试利用字典中的值填充对应参数,进而生成URL。
到这里URL就生成完成了,这个过程中要求比较多,但是跟着步骤来,应该还是容易理解的。还要提及的是一个溢出参数:这是指在URL生成过程中使用但没有在路由定义中指定的路由值,具体指的是路由的URL 默认字典,约束字典中的值,外界值不能做为溢出参数使用。溢出参数会做为查询字符串参数附加在生成的URL之后,只要路由指定的参数达到满足,是否指定额外参数则无关紧要
Asp.Net MVC路由生成URL过程的更多相关文章
- ASP.NET没有魔法——ASP.NET MVC路由
之前的文章中介绍了My Blog文章维护功能的开发,开发过程中使用Area的方法建立了用于维护文章的Controller.View和Model.但是无论代码怎么变对于浏览器来说都是通过一个url地址去 ...
- ASP.NET MVC 路由(一)
ASP.NET MVC路由(一) 前言 从这一章开始,我们即将进入MVC的世界,在学习MVC的过程中在网上搜索了一下,资料还是蛮多的,只不过对于我这样的初学者来看还是有点难度,自己就想看到有一篇引导性 ...
- ASP.NET MVC 路由(二)
ASP.NET MVC路由(二) 前言 在上一篇中,提及了Route.RouteCollection对象的一些信息,以及它们的结构所对应的关系.按照处理流程走下来还有遗留的疑问没有解决这个篇幅就来讲 ...
- ASP.NET MVC 路由(三)
ASP.NET MVC路由(三) 前言 通过前两篇的学习会对路由系统会有一个初步的了解,并且对路由系统中的Url规则有个简单的了解,在大家的脑海中也有个印象了,那么路由系统在ASP.NETMVC中所处 ...
- 【ASP.NET MVC 牛刀小试】 URL Route
例子引入 先看看如下例子,你能完全明白吗? using System; using System.Collections.Generic; using System.Linq; using Syste ...
- 【ASP.NET MVC系列】浅谈ASP.NET MVC 路由
ASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作 ...
- asp.net Mvc 路由详解,非常详细.
关于路由的理解 为什么要定义路由?路由的定义在开发中的工作量非常小,但是非常重要,因为任何请求都离不开路由. 各个电商网站的 URL 使用非常灵活,都离不开路由的定义,请大家参考几家电商的 URL 如 ...
- ASP.NET MVC 路由(五)
ASP.NET MVC 路由(五) 前言 前面的篇幅讲解了MVC中的路由系统,只是大概的一个实现流程,让大家更清晰路由系统在MVC中所做的以及所在的位置,通过模糊的概念描述.思维导图没法让您看到路由的 ...
- [Buffalo]ASP.NET MVC路由映射
Asp.Net的路由系统旨在通过注册URl模版与物理文件之间的映射进而实现请求地址与文件路径之间的分离,但对于Asp.Net Mvc应用来说,请求的目标却是定义在某个Controller类型中的Act ...
随机推荐
- SSL/TLS抓包出现提示Ignored Unknown Record
SSL/TLS抓包出现提示Ignored Unknown Record 出现这种提示有两种情况.第一种,抓包迟了,部分SSL/TLS的协商数据没有获取,Wireshark无法识别和解析.第二种,数据包 ...
- 如何给小学生讲清楚ECC椭圆曲线加密
对于RSA这套公私钥加密的思路,我以为我挺明白的,运用的娴熟自如. 当然现在RSA用的不多,而是基于ECC曲线来做签名验签,最大名鼎鼎的莫过于比特币. 可是前两天和别人讲代码,被问了ECC为什么可以用 ...
- RSP小组——团队冲刺博客六
RSP小组--团队冲刺博客六 冲刺日期:2018年12月18日 前言 各成员今日(12.18)完成的任务 李闻洲,赵乾宸代码合并 马瑞蕃图形后续支持,编写博客,燃尽图 蒋子行会议记录 各个成员的任务安 ...
- C++ 用变量定义数组
较早的编译器是不同意这样做的,所以一些书籍比方以Tc解说的书本都说数组的下标不能是变量.在vc6.0下亦是如此. 只是在一些较新的编译器如dev c++已经支持了,例如以下代码不会报错 #includ ...
- css3 图片阴影
box-shadow:1px 2px 4px #999999; 效果:
- 全民https时代,Let's Encrypt免费SSL证书的申请及使用(Tomcat版)
近几年,在浏览器厂商的强力推动下,HTTPS的使用率大增.据统计,Firefox加载的网页中启用HTTPS的占比为67%,谷歌搜索结果中HTTPS站点占比已达50%,HTTPS网站已获得浏览器和搜索引 ...
- Hadoop namenode节点无法启动的问题解决
namenode是Hadoop集群HDFS的管理节点,管理着整个分布式文件系统的命名空间,以及文件与块的映射关系等,在Hadoop集群中扮演着至关重要的作用. 我之前安装的Hadoop集群中namen ...
- Docker安装ngnix使用ping报错
最近在学习docker时,由于docker维护的dockerHub远程仓库的镜像文件比普通的文件小得多,所以经常碰到的情况是,一般常用的命令,会出现no command的情况.今天安装ping的时候就 ...
- c#提交事务的两种方法
1. using (TransactionScope ts = new TransactionScope()) { 除非显示调用ts.Complete()方法.否则,系统不会自动提交这个事务.如果在代 ...
- vue项目开发基本目录结构
§ 目录结构 . ├── build/ # Webpack 配置目录 ├── dist/ # build 生成的生产环境下的项目 ├── src/ # 源码目录(开发都在这里进行) │ ├── ass ...