ASP.NET MVC 的URL路由介绍
在这个教程中,向你介绍每个ASP.NET MVC一个重要的特点叫做URL路由。URL路由模块是负责映射从浏览器请求到特定的控制器动作。
在教程的第一部分,你将学习标准路由表如何映射到控制器的动作。在教程第二部分,你将学习如何修改默认路由表成为自定义路由。
使用默认路由表
当你创建一个新的ASP.NET MVC 应用程序,应用程序已经配置了默认的URL路由。URL路由在两个地方设置。
第一,URL路由配置在你的应用程序WEB配置文件中(Web.config文件)。文件中有四个有关路由的配置节:system.web.httpModules节,system.web.httpHandlers节,system.webserver.modules节,和system.webserver.handlers节。小心不要删除这些配置节,因为没有这些配置节路由将不在工作。
第二,更为重要的是,一个路由表在应用程序的Global.asax文件中创建。Global.asax文件是一个特别的文件,它包含了ASP.NET应用程序生命周期事件处理。当Application Start事件开始,路由被创建。
图1是一个ASP.NET MVC应用程序的默认Global.asax文件。
图 1 – Global.asax.cs
当一个ASP.NET MVC应用程序第一次运行时, Application_Start()方法被调用。这个方法,又调用RegisterRoutes()方法,RegisterRoutes()方法创建了路由表。
默认的路由本包含一个路由(命名Default).默认路由第一段URL映射到一个控制器名字,第二段URL映射到一个动作,第三段映射到一个参数叫Id.
想象你在浏览器地址栏输入以下URL:
/Home/Index/3
默认路由映射以下这些参数:
controller = Home
action = Index
id = 3
当你请求URL /Home/Index/3,以下代码会被执行:
HomeController.Index(3)
默认路由包括默认的三个参数。如果你提供一个控制器,那默认控制器参数值就是Home.如果你不提供一个动作,那默认动作参数的值就是Index.最后,如果你不提供一个id,那id参数默认是一个空字符串。
让我们看一些默认路由如何映射URL到控制器动作的示例。想象你在浏览器地址栏输入以下URL:
/Home
因为默认路由参数,这个URL会引起HomeController 类的Index()方法如图2被调用。
图2 – HomeController.cs
在图2中, HomeController类包含一个叫Index()的方法,它接受单个叫Id的参数。URL /Home 引起值为空字符串Id参数的 Index()被调用。
因为ASP.NET MVC框架调用控制器动作这个方式,the URL /Home 也匹配图3中的HomeController类 Index()方法。
图 3 – HomeController.cs (无参数的Index action)
图3中这个Index()方法不接受任何参数。URL /Home 将引起Index()的方法被调用。URL /Home/Index/3 也调用这个方法。(Id是被忽略的)
URL /Home 也匹配图4 中HomeController类Index()方法
图 4 – HomeController.cs (可空参数Index action)
图4中, Index()有一个整型方法. 因为参数是可空类型 (值能够为空), Index() 调用不能产生错误。
最后,图5中调用Index(),URL /Home引起一个异常从Id参数不是可空类型参数,如果你尝试调用Index()方法,你得来以一个错误页面:
图5 – HomeController.cs (Index action with)
URL /Home/Index/3, 另一方面, 图5中控制器 Index 动作是可以工作的。The 请求 /Home/Index/3 引发带一个值为3 Index() 方法被调用。
创建自定义路由
对于许多简碟的ASP.NET MVC 应用程序,默认路由表足够了。但是,你可能发现你有特别路由的需要。在这个案例中,你能创建一个自定义路由。
想象下,例如,你写一个BLOG应用程序,你可能要处理像这样的请求:
/Archive/12-25-2009
当一个用户发起这个请求,你要返回一个符合12/25/2009日期的BLOG。因此处理这样的请求,你需要创建一个自定义路由。
图6中Global.asax文件包含一个新的自定义路由,叫做Blog,处理像这样/Archive/entry date的请求。
图 6 – Global.asax (自定义路由)
路由表中你增加的路由顺序是很重要的。我们自定义Blog路由是增加在默认路由之前的。假如你搞反了,那默认路由将永远替代调用自定义路由。
自定义Blog路由匹配任何/Archive/开始请求,所以它匹配所有以下URLs:
/Archive/12-25-2009
/Archive/10-6-2004
/Archive/apple
这个自定义路由映射进来的请求到一个名叫Archive控制器同时调用Entry()方法,当Entry()方法被调用时,进入日期转成一个名叫entryDate参数。
在图7中 你能使用控制器与BLOG自定义路由。
图 7 – ArchiveController.cs
注意图7中的Entry()方法接受一个DateTime 类型的参数.ASP.NET MVC 框架是智能的,它能从URL的DateTime的值自动的转换为entry date。如果entry date从URL不能转换为DateTime,将引出错误。
总结
教程的目的提供你关于URL路由一段简短的介绍。第一,我们检验了你拿到一个新的ASP.NET MVC 应用程序的默认路由表。你学习到了默认路由表是如何把URL映到控制器动作的。
接下来,你学习了如何创建一个自定义路由表。你学习了如何在Global.asax文件中增加一个自定义路由表描述blog进入点。我们讨论如何映射请求blog进入点到一个名叫ArchiveController的控制器名叫Entry()的动作。
ASP.NET MVC 的URL路由介绍的更多相关文章
- 【转载】ASP.NET MVC重写URL制作伪静态网页,URL地址以.html结尾
在搜索引擎优化领域,静态网页对于SEO的优化有着很大的好处,因此很多人就想把自己的网站的一些网页做成伪静态.我们现在在网络上发现很多博客网站.论坛网站.CMS内容管理系统等都有使用伪静态这一种情况,伪 ...
- 【翻译】ASP.NET MVC 5属性路由(转)
转载链接:http://www.cnblogs.com/thestartdream/p/4246533.html 原文链接:http://blogs.msdn.com/b/webdev/archive ...
- MVC的URL路由规则
MVC的URL路由规则 Routing的作用:它首先是获取到View传过来的请求,并解析Url请求中Controller和Action以及数据,其次他将识别出来的数据传递给Controller的Act ...
- 为ASP.NET MVC应用添加自定义路由
这里,我们将学习如何给asp.net mvc应用添加自定义路由.用自定义路由来修改默认路由表. 对一些简单的asp.net mvc应用,默认的路由表就已经足够了.但是,当你需要创建特殊的路由时,就需要 ...
- Asp.Net MVC2.0 Url 路由入门---实例篇
本篇主要讲述Routing组件的作用,以及举几个实例来学习Asp.Net MVC2.0 Url路由技术. 接着上一篇开始讲,我们在Global.asax中注册一条路由后,我们的请求是怎么转到相应的Vi ...
- Asp.Net MVC2.0 Url 路由入门---实例篇 【转】
本篇主要讲述Routing组件的作用,以及举几个实例来学习Asp.Net MVC2.0 Url路由技术. 接着上一篇开始讲,我们在Global.asax中注册一条路由后,我们的请求是怎么转到相应的Vi ...
- (转)Asp.Net Mvc视图引擎Razor介绍
Asp.Net Mvc视图引擎Razor介绍 1.Razor介绍 程序园原创,转载请注明:http://www.kwstu.com/ArticleView/dabaomvc_2014082408205 ...
- ASP.NET MVC 学习之路由(URL Routing)
在ASP.NET MVC中,一个URL请求是由对应的一个Controller中的Action来处理的,由URL Routing来告诉MVC如何定位到正确的Controller和Action. 默认路由 ...
- asp.net mvc 通过修改路由规则来实现页面的URL多参数传递
[原文]http://blog.csdn.net/risingsun001/article/details/9068187 修改MVC3中的路由规则 在Global.asax.cs中,修改路由规则 原 ...
随机推荐
- java设计优化--观察者模式
观察者模式介绍 观察者模式是一种非常有用的设计模式,在软件系统中,当一个对象的行为依赖于另一个对象的状态时,观察者模式就非常有用.如果不适用观察者模式,而实现类似的功能,可能就需要另外启动一个线程不停 ...
- G-nav-04
'use strict';define([ 'jquery'], function($) { var nav = { init : function() { $("#burger-menu& ...
- LightOJ1348 树链剖分
简单题,看题目就懂. #include<queue> #include<stack> #include<cmath> #include<cstdio> ...
- Spring控制Hibernate的缓存机制ehcache
首先在spring.xml中进入bean <prop key="hibernate.cache.use_second_level_cache">true</pro ...
- ThinkPHP多表联合查询的常用方法
1.原生查询示例: $Model = new Model(); $sql = 'select a.id,a.title,b.content from think_test1 as a, think_t ...
- SVN 服务器端安装过程
1.安装软件版本: VisualSVN-Server-2.1.5.msi 右击安装软件,单机“安装” 2.单击[Next] 选择“I accept the terms in the License A ...
- 【BZOJ-2818】Gcd 线性筛
2818: Gcd Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 3347 Solved: 1479[Submit][Status][Discuss ...
- BZOJ-3669 魔法森林 Link-Cut-Tree
意识到背模版的重要性了,记住了原理和操作,然后手打模版残了..颓我时间...... 3669: [Noi2014]魔法森林 Time Limit: 30 Sec Memory Limit: 512 M ...
- jdbc链接mysql转
完整java开发中JDBC连接数据库代码和步骤 JDBC连接数据库 •创建一个以JDBC连接数据库的程序,包含7个步骤: 1.加载JDBC驱动程序: 在连接数据库之前,首先要加载想要连接的数据库的 ...
- UVa OJ 140 - Bandwidth (带宽)
Time limit: 3.000 seconds限时3.000秒 Problem问题 Given a graph (V,E) where V is a set of nodes and E is a ...