MVC之URL路由
注册路由规则集合
一个 Web 应用具有一个全局的路由表,该路由表通过 System. Web.Routing.RouteTable
的静态只读属性 Routes 表示,该属性返回一个类型为 System. Web.Routing.RouteCollection
集合
Global.asax是程序的入口,在添加的 Globa l. asax 文件中,我们将路由注册操作定义在 App lication_ Start 方法。
protected void Application_Start()
{
//注册区域
AreaRegistration.RegisterAllAreas();
//注册筛选器
RegisterGlobalFilters(GlobalFilters.Filters);
//注册路由规则
RegisterRoutes(RouteTable.Routes);
}
路由规则的定义
路由规则应用层代码
上面RegisterRoutes(RouteTable.Routes);便是注册路由的操作。参数RouteTable.Routes构造了一个路由容器。下列的RegisterRoutes方法是对这个容器添加路由映射机制
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); string url = ConfigurationManager.AppSettings["VirtualPath"] + "{0}" + ConfigurationManager.AppSettings["FileExtension"] ?? ".html"; //分类列表页面
routes.MapRoute("Class", string.Format(url, "class/{show}-{typeid}-{page}-{parid}"), new { controller = "Home", action = "Class", show = "all", typeid = "", page = "", parid = "" }, new { show = "(solute)|(wait)|(noanswer)|(all)|(overdue)", typeid = "\\d+", page = "\\d+" });
//详细页面
routes.MapRoute("Detail", string.Format(url, "detail/{id}"), new { controller = "Home", action = "Detail" }, new { id = "\\d+" });
//首页
routes.MapRoute(
"Default", // 路由名称
"{controller}/{action}/{id}", // 带有参数的 URL
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // 参数默认值
); //错误页面
routes.MapRoute(
"Error",
"error.shtml",
new { controller = "Shared", action = "Error" }
);
}
RegisterRoutes(RouteCollection routes)路由规则的定义和添加
路由的注册是自上而下优先匹配原则。
如果Default放在你定义的其他路由之前,并且其他路由也满足{controller}/{action}/{id},那么路由将会报错。比如
routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional }
); routes.MapRoute(
"ProductDetailPage",
string.Format(url, "Group/{productID}"),
//"group/{productID}.html",
new { controller = "Detail", action = "Index", productID = },
new { productID = @"\d+" } );
routes.MapRoute(
"SearchPage",//Route name
string.Format(url, "Group/{cityID}/{productType}/{currentPageIndex}"),//URL with parameters
new { controller = "Group", action = "Index", cityID = "", productType = "", currentPageIndex = } );
比如Default默认的路由的规则(一般用于首页)它的规则的是控制器/方法/参数。而我定义一个产品详情页ProductDetailPage 虽然它映射的地址不一样,但是它的定义路由规则也是控制器/方法/参数。
按照自上而下的匹配规则,那么他匹配的就是Default而不是ProductDetailPage 。但由于从请求传过来的参数是ProductDetailPage 定义的productID而不是Default定义的参数id所以就会“/”应用程序中的服务器错误,无法找到资源。的错误。
而SearchPage这个路由规则是控制器/方法/参数1/参数2/参数3,参数的个数和Default不一样。所以认为路由规则不一样。
路由规则添加的底层源码
public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, object constraints, string[] namespaces)
{
if (routes == null)
{
throw new ArgumentNullException("routes");
}
if (url == null)
{
throw new ArgumentNullException("url");
}
Route item = new Route(url, new MvcRouteHandler()) {
Defaults = new RouteValueDictionary(defaults),
Constraints = new RouteValueDictionary(constraints),
DataTokens = new RouteValueDictionary()
};
if ((namespaces != null) && (namespaces.Length > ))
{
item.DataTokens["Namespaces"] = namespaces;
}
routes.Add(name, item);
return item;
}
从上面可以看出路由规则是由name和Route这样的一对键值对组成的。
Route又提供了两个参数和三个属性
参数:所要映射的URL地址和MVCRouteHandle路由处理程序。
而MVCRouteHandle其类型为具有如下定义的System.Web.Routing .I RouteHandler 接口。
IRouteHandler 接口在整个 URL 路由系统中具有重要的地位,其重要作用在于提供最终用于处理请求的 Handler 对象(通过调用其GetHttpHandler 方法获取)
属性
default(默认值),Contrant(约束),和DataTokens 三个属性,它们都是一个具有如下定义的类型为
System.Web.Routing.RouteValueDictionary 的对象。 Route ValueDictionary 是一个用于保存路由
变量的字典,其 Key Value 分别表示变量的名称和值。
MVC之URL路由的更多相关文章
- MVC的URL路由规则
MVC的URL路由规则 Routing的作用:它首先是获取到View传过来的请求,并解析Url请求中Controller和Action以及数据,其次他将识别出来的数据传递给Controller的Act ...
- ASP.NET MVC 的URL路由介绍
在这个教程中,向你介绍每个ASP.NET MVC一个重要的特点叫做URL路由.URL路由模块是负责映射从浏览器请求到特定的控制器动作. 在教程的第一部分,你将学习标准路由表如何映射到控制器的动作.在教 ...
- MVC中url路由规则
Routing:首先获取视图页面传过来的请求,并接受url路径中的controller和action以及参数数据,根据规则将识别出来的数据传递给某controller中的某个action方法 MapR ...
- 《Entity Framework 6 Recipes》中文翻译系列 (21) -----第四章 ASP.NET MVC中使用实体框架之在页面中创建查询和使用ASP.NET URL路由过虑
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 4.2. 构建一个搜索查询 搜索数据是几乎所有应用的一个基本功能.它一般是动态的,因 ...
- mvc中Url.RouteUrl或者Html.RouteLink实现灵活超链接,使href的值随路由名称或配置的改变而改变[bubuko.com]
mvc,超链接除了直接写在a标签的href内还可以使用路由规则来生成,这样在改变了路由规则或者路由名称时不用再去代码中更改href的值,而且还容易遗漏.借助Url.RouteUrl或者Html.Rou ...
- Spring mvc源码url路由-我们到底能走多远系列(38)
我们到底能走多远系列38 扯淡: 马航的事,挺震惊的.还是多多珍惜身边的人吧. 主题: Spring mvc 作为表现层的框架,整个流程是比较好理解的,毕竟我们做web开发的,最早也经常接触的就是一个 ...
- MVC模式中路由如何生成URL
路由有必要的参数吗 在MVC设计模式中,一个比较重要的步骤是浏览器发送的请求如何生成相应的URL,交给服务器去实例化相应的控制器类然后调用相应的控制器类的对应方法,返回视图给用户.这个流程细说起来比较 ...
- asp.net MVC URL路由入门指南
asp.net MVC 的URL路由是一个非常强大的功能,而且有个优点:强大单不复杂.然而,目前我在网上看到的相关资料,却都仅仅提供一些示例,仅通过这些示例,初学者基本上不可能明白为什么要这么配置,更 ...
- 8.MVC框架开发(URL路由配置和URL路由传参空值处理)
1.ASP.NET和MVC的路由请求处理 1)ASP.NET的处理 请求---------响应请求(HttpModule)--------处理请求(HttpHandler)--------把请求的资源 ...
随机推荐
- catkin_make broken after intalling python 3.5 with anaconda
"No module named catkin_pkg.package" on catkin_make w/ Indigo I have the problem after ana ...
- C#中Application.DoEvents()的作用
Visual Studio里的摘要:处理当前在消息队列中的所有 Windows 消息. 交出CPU控制权,让系统可以处理队列中的所有Windows消息,比如在大运算量循环内,加Application. ...
- iOS : 静态库制作
一.静态库简介 1. 什么是库? 库 就是程序代码的集合, 是共享程序代码的一种方式 2. 库的分类? 开源库 公开源代码, 能看到具体实现 例如MJExtension, MJRefresh, AFN ...
- 树--四分树(UVa297)
郑重声明: 数据结构这部分内容, 由于博主才学很少(且很浅)的内容, 所以现在所写的(大都是抄的)一些典型例题, 再加上一些自己想法和理解而已, 等博主勤加修炼, 以后会大有补充和改进. 粗浅之处, ...
- TCP三次握手及四次挥手详细 转
一.TCP报文格式 TCP/IP协议的详细信息参看<TCP/IP协议详解>三卷本.下面是TCP报文格式图: 图1 TCP报文格式 上图中有几个字段需要重点介绍下: ...
- ubuntu 卸载/安装 redis
ubuntu 卸载redis 1. 卸载软件 apt-get remove redis 2. 清除配置 apt-get remove --purge redis 3. 删除残留文件 find / -n ...
- linux下文件系统类型的学习
1. 以超级用户权限登陆Linux,进入 /lib/modules/2.6.32--504.el6.x86_64/kernel/fs目录执行 ls 命令(不同Linux发行版本的Fs目录有些不同你可 ...
- [转] Android获取Manifest中<meta-data>元素的值
转自: http://www.2cto.com/kf/201303/194824.html android 开发中: 在AndroidManifest.xml中,<meta-data> ...
- Java 两个变量交换值
package test; public class Test { public static void main(String[] args) { int a, b; ...
- D3.js 弦图的制作
这是一种用于描述节点之间联系的图表. 1. 弦图是什么 弦图(Chord),主要用于表示两个节点之间的联系. 两点之间的连线,表示谁和谁具有联系: 线的粗细表示权重: 2. 数据 初始数据为: var ...