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 ...
随机推荐
- PC端问题列表及解决方案
一.CSS相关 1.PC站百度文件引用不到,出现报错,问题可能是电脑拦截了百度广告. 解决方案:把拦截广告的浏览器插件关掉. 2.ie6双倍边距:在使用了float的情况下,不管是向左还是向右都会出现 ...
- BZOJ 4455
树的点到图的点是双射 枚举哪些点可以映射到 然后dp容斥 复杂度 $2^n*n^3$ #include<bits/stdc++.h> using namespace std; #defin ...
- 小白学习随笔the first week
The First Week 一.计算机基础 1.软件(应用程序) 2.解释器/编译器 - 解释型语言:将代码每一行传递给计算机一行,常用编程语言python,PHP,Ruby. - 编译型语言:将代 ...
- C#中添加log4net(日志文件)
1.先下载引用“log4net” 2.然后再App.config配置 3.添加一个LogHandler类 4.在Assemblyinfo类中添加配置的读取文件 5.运用日志文件 6.显示结果
- javascript 插入DOM节点
1.使用appendChild,把一个子节点添加到父节点的最后一个子节点,.innerText插入的是内容 HTML <!-- HTML结构 --> <p id="js&q ...
- LeetCode笔记:39. Combination Sum
题目描述 给定一个无重复的正整数数组 candidates 和一个正整数 target, 求所有和为 target 的 candidates 中数的组合中.其中相同数的不同顺序组合算做同一种组合,ca ...
- Linux 搭建Nginx+uWSGI+Django环境
安装环境 sudo apt-get install nginx sudo apt install python3 sudo apt install python3-pip 使用 sudo pip3 i ...
- 设置mysql InnoDB存储引擎下取消自动提交事务
mysql 存储引擎中最长用的有两种,MyISAM 存储引擎和InnoDB存储引擎. 1.MyISAM 存储引擎 不支持事务,不支持外键,优势是访问速度快: 2.InnoDB存储引擎 支持事务,一般项 ...
- C语言复习5_调试
使用CodeBlocks调试程序 首先要注意,只有打开projects(.cbp文件)的情况下才能debug,单独打开.c文件是不能debug的 1.在行号旁边左键,出现红点,表示为断点breakpo ...
- 基于js的数据结构与算法-数组
Given an array of integers, return indices of the two numbers such that they add up to a specific ta ...