这次谈一谈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过程的更多相关文章

  1. ASP.NET没有魔法——ASP.NET MVC路由

    之前的文章中介绍了My Blog文章维护功能的开发,开发过程中使用Area的方法建立了用于维护文章的Controller.View和Model.但是无论代码怎么变对于浏览器来说都是通过一个url地址去 ...

  2. ASP.NET MVC 路由(一)

    ASP.NET MVC路由(一) 前言 从这一章开始,我们即将进入MVC的世界,在学习MVC的过程中在网上搜索了一下,资料还是蛮多的,只不过对于我这样的初学者来看还是有点难度,自己就想看到有一篇引导性 ...

  3. ASP.NET MVC 路由(二)

     ASP.NET MVC路由(二) 前言 在上一篇中,提及了Route.RouteCollection对象的一些信息,以及它们的结构所对应的关系.按照处理流程走下来还有遗留的疑问没有解决这个篇幅就来讲 ...

  4. ASP.NET MVC 路由(三)

    ASP.NET MVC路由(三) 前言 通过前两篇的学习会对路由系统会有一个初步的了解,并且对路由系统中的Url规则有个简单的了解,在大家的脑海中也有个印象了,那么路由系统在ASP.NETMVC中所处 ...

  5. 【ASP.NET MVC 牛刀小试】 URL Route

    例子引入 先看看如下例子,你能完全明白吗? using System; using System.Collections.Generic; using System.Linq; using Syste ...

  6. 【ASP.NET MVC系列】浅谈ASP.NET MVC 路由

    ASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作 ...

  7. asp.net Mvc 路由详解,非常详细.

    关于路由的理解 为什么要定义路由?路由的定义在开发中的工作量非常小,但是非常重要,因为任何请求都离不开路由. 各个电商网站的 URL 使用非常灵活,都离不开路由的定义,请大家参考几家电商的 URL 如 ...

  8. ASP.NET MVC 路由(五)

    ASP.NET MVC 路由(五) 前言 前面的篇幅讲解了MVC中的路由系统,只是大概的一个实现流程,让大家更清晰路由系统在MVC中所做的以及所在的位置,通过模糊的概念描述.思维导图没法让您看到路由的 ...

  9. [Buffalo]ASP.NET MVC路由映射

    Asp.Net的路由系统旨在通过注册URl模版与物理文件之间的映射进而实现请求地址与文件路径之间的分离,但对于Asp.Net Mvc应用来说,请求的目标却是定义在某个Controller类型中的Act ...

随机推荐

  1. python爬取珞珈1号卫星数据

    首先登录珞珈一号数据系统查询想要的数据 利用浏览器审查元素获取包含下载信息的源码 将最右侧的table相关的网页源码copy到剪切板备用 利用python下载数据 ## utf-8 import re ...

  2. 编程菜鸟的日记-初学尝试编程-C++ Primer Plus 第6章编程练习6

    #include <iostream> #include <string> using namespace std; const int MSIZE=100; struct j ...

  3. python学习笔记(5)

    .................................................................................................... ...

  4. delegate异步

    using System; using System.Runtime.Remoting.Messaging; using System.Threading; using System.Threadin ...

  5. numpy地址

    pip安装  http://zhidao.baidu.com/link?url=nkRwDOZ1ALMjRsWHGMR1nLSIyuVycoD4j-mhGDsYptPwDRGYcE8u4_B9VvYk ...

  6. Java工作原理:JVM,内存回收及其他

    JAVA虚拟机系列文章 http://developer.51cto.com/art/201001/176550.htm Java语言引入了Java虚拟机,具有跨平台运行的功能,能够很好地适应各种We ...

  7. Android Studio 真机调试 连接手机

    前提:adb环境已经配置 手机端: 1.打开手机开发者权限,”设置“ 中找到 “版本号”,连续多次点击,会提示打开“开发者”.我的是 “设置” --> "关于手机" --&g ...

  8. Javascript高级编程学习笔记(90)—— Canvas(7) 绘制图像

    绘制图像 2D绘图上下文内置了对图像的支持 如果希望将一幅图绘制到画布上,可以使用 drawImage() 的方法 该方法有三种不同的参数数组合以对应不同的应用场景 将<img>绘制到画布 ...

  9. [Swift]LeetCode19. 删除链表的倒数第N个节点 | Remove Nth Node From End of List

    Given a linked list, remove the n-th node from the end of list and return its head. Example: Given l ...

  10. [Swift]LeetCode375. 猜数字大小 II | Guess Number Higher or Lower II

    We are playing the Guess Game. The game is as follows: I pick a number from 1 to n. You have to gues ...