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 ...
随机推荐
- 953.Verifying an Alien Dictionary(Map)
In an alien language, surprisingly they also use english lowercase letters, but possibly in a differ ...
- ubuntu 18.04 安装mysql 8.0
1.下载配置(不然直接装的是mysql5.7): wget https://repo.mysql.com//mysql-apt-config_0.8.10-1_all.deb 2.更新配置: sudo ...
- 详解Session和cookie
1.cookie 1.1. 为什么会有cookie? 由于HTTP是无状态的,服务端并不记得你之前的状态.这种设计是为了HTTP协议的方便,但是也存在一些问题.比如我们登录一个购物网站,我们需要用户登 ...
- 检查对象是否为NULL或者为Empty
不管是在Winform开发,还是在asp.net 开发中当从一个数据源中获取数据时你总是不知道这个数据的状态,这个时候总要对她进行一次判断,不过每次进行一次判断总是要写怎么一堆代码,时间长了,总感觉不 ...
- Php中文件下载功能实现超详细流程分析
浏览器发送一个请求,请求访问服务器中的某个网页(如:down.php),该网页的代码如下 客户端从服务端下载文件的流程分析: 浏览器发送一个请求,请求访问服务器中的某个网页(如:down.php) ...
- Tips_钉钉免登前端实现
1.需求:开发钉钉微应用,需要实现钉钉的免登陆功能. #.其实钉钉的文档中心还是很详细的,只是刚开始接触会一头雾水,所以花费了挺多时间....... ?什么是钉钉免登功能. ?企业应用免登开发授权流程 ...
- 转 the best for wcf client
原文:http://stackoverflow.com/questions/573872/what-is-the-best-workaround-for-the-wcf-client-using-bl ...
- 总结css常用方法
1.自定义滚动条 .test-1::-webkit-scrollbar {/*滚动条整体样式*/ width: 10px; /*高宽分别对应横竖滚动条的尺寸*/ height: 1px; } .tes ...
- Eclipse自动补全调教
方法来自http://www.cnblogs.com/sunjie21/archive/2012/06/28/2567463.html 调教后可以做到: 1. sout + Tab 输出System. ...
- React修改state(非redux)中数组和对象里边的某一个属性的值
在使用React时,会经常需要处理state里边设置的初始值以达到我们的实际需求,比如从接口获取到列表数据后要赋值给定义的列表初始值,然后数据驱动view视图进而呈现在我们眼前,这种最简单的赋值方式实 ...