asp.net MVC 路由机制 Route
1:ASP.NET的路由机制主要有两种用途:
-->1:匹配请求的Url,将这些请求映射到控制器
-->2:选择一个匹配的路由,构造出一个Url
2:ASP.NET路由机制与URL重写的区别
-->Url重写关注的是将一个Url映射到另一个Url。
路由机制关注的是将Url映射到资源上。资源不一定是一个物理页面,可以是类中的方法。
-->Url重写只能用于传入的请求Url
路由机制可以匹配传入的Url,也能够生成一个Url
-->Url重写大多是IIS级别的,是IIS的一个组件
路由机制是HttpModule级别,可以用代码进行良好地控制
3:路由Url
RouteTable.Routes.MapRoute("simple","{first}/{second}/{third}');
第一个参数是路由名称,第二个参数是路由模式。
路由系统会将客户端请求的Url,依照路由模式进行解析,并将其解析到RouteValueDictionary实例的键/值中,存储到RouteData中,可以通过RequestContext访问RouteValueDictionary中的值。key就是路由模式中德参数名称,值为请求url中的值。例如:
请求的url为:/abc/display/123,那么解析到RouteData中的数据为:first="abc",second="display",third="123"
4:MVC中特殊的Url参数名称-{controller}和{action}
因为在MVC中,Url都会映射到控制器上的一个方法上,所以MVC框架需要使用一些特定的参数名称{controller}{action}。{controller}参数用来实例化一个控制器类。按照约定优先的惯例,MVC将字符串Controller添加到{controller}参数值的后面,得到一个类名,然后根据这个类名查找实现了System.Web.Mvc.IController接口的类型,完成实例化。除了{controller}{action}之外,其他的参数当作控制器action方法的参数来处理。
RouteTable.Routes.MapRoute("simple","{controller}/{action}/{id}');
/abc/display/123请求会实例成abcController的控制器类,调用其中的display()方法,同时将123传递给display()方法的参数id
5:路由中的字面值
Url段中允许字面值和参数混合在一起。它仅有的限制就是不允许有两个连续Url的参数
{language}-{country}/{controller}/{action}
{controller}.{action}.{id}
这些都是合法的。
6:路由的默认值
为Routes.MapRoute()方法传递一个默认值的字典。我们可以使用简明的语法来定义字典,MapRoute()方法会在底层将简明的语法new {controller="Home",action="Index",id=UrlparameterOptional}转换成一个RouteValueDirectionary的一个实例。
-->1默认值对于Url参数位置十分重要,只有为当前参数后面的每一个参数都定义了默认值,路由才会采用当前参数的默认值,{controller}/{action}/{id},如果我们为{action}提供了默认值,没有为{id}提供默认值,那么效果与不给{action}默认值是一样的。下面例子:
RouteTable.Routes.MapRoute("simple1","{controller}/{action}/{id}",new {action="index"});
RouteTable.Routes.MapRoute("simple2","{controller}/{action}");
/abc/display这个Url只能匹配到simple2,因为只有为当前参数后面的每一个参数都定义了默认值,路由才会采用当前参数的默认值。
-->2任何带有字面量的Url段在匹配请求的URL时,都禁止省略任何参数值。
RouteTable.Routes.MapRoute("simple","{controller}-{action}",new {action="Index"});
它并不能匹配/abc-的请求,因为字面量-后面的参数{action}被省略了。
7:路由约束
请求Url段的数量与路由模式中定义的参数个数能够匹配上,那么路由就能匹配这个url,但是我们需要对Url有更多的控制,就需要使用路由约束。
为Routes.MapRoute()方法传递一个正则表达式约束的字典。我们可以使用简明的语法来定义字典,在方法的内部使用Regex类,将其转换成RouteValueDirectionary类型的对象。
RouteTable.Routes.MapRoute("simple","{controller}/{action}/{id}",new {controller="Home",action="Index",Id=""},new {controller=@"\w+",action=@"\w+",id=@"\d+"});
-->自定义路由约束
除了正则表达式约束之外,我们可以实现IRouteConstraint接口,实现接口的Match()方法
系统已经为我们创建了一个实现IRouteConstraint接口的HttpMethodConstraint类,约束路由只能匹配指定的Http方法。
RouteTable.Routes.MapRoute("default","{controller}/{action}/{id}",null,new
{httpMethod=HttpMethodConstraint("GET")}); 这个路由只能匹配Get请求。
8:路由名称
-->1:在路由系统匹配请求的Url的时候,可以不需要用到路由名称。但是在生成一个Url的时候,就需要一个已经定义的路由名称,按照这个路由定义的规则,生成一个Url。在生成Url的时候,对路由选择进行精确控制。
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home",
action = "Index", id = UrlParameter.Optional }
);
routes.MapRoute(
name: "Test",
url: "code/p/{action}/{id}",
defaults: new {Controller="Home",action="index",id=UrlParameter.Optional
}
);
@Html.RouteLink("Test",
"Test", new
{ action = "indexTest",id=123
})
选择Test的路由,生成的Url是code/p/indexTest/123
@Html.RouteLink("Default",
"Default", new { controller = "homeTest",
action = "indexTest",id=123 })
先择Default路由,生成的Url是homeTest/indexTest/123
-->2:在使用路由创建Url的时候,如果提供的路由有多余的,将被添加到url的后面,当作URL参数。
@Html.RouteLink("Test",
"Test", new
{ action = "indexTest",id=123,para=456
})
选择Test的路由,生成的Url是code/p/indexTest/123?para=456
9:MVC区域
区域允许我们将模型,视图和控制器分成单独的功能节点。我们可以将大型复杂的网站分成若干个节点,方便管理。每一个区域都有单独的路由系统。
我们可以通过为每一个区域创建一个类,来配置区域路由。这个类要派生自AreaRegistration类,重写其中的AreaName和RegisterArea成员。在Global.asax文件中,调用AreaRegistration.RegisterAllAreas()方法,就会调用每一个区域的RegisterArea()
-->区域路由的冲突。
当在两个区域中,当有两个相同名称的控制器,那么当前传入的请求匹配没有指定名称空间的路由时,系统会抛出一个异常
9.1:名称空间来区分控制器的优先顺序
当输入的一个Url请求与一条路由匹配时,如果有多个同一名称的控制器,就会出现异常。我们可以在路由注册的时候,对某些名称空间制定优先级。
routes.MapRoute("myRoute","{controller}/{action}/{id}/{*catchall}",new{controller="Home",action="Index",id=UrlParameter.Optional},new[]{"MyNamespace"});
9.2:禁用后备的名称空间
可以告诉MVC路由系统,只查看指定的名称空间。在这个指定的名称空间下,如果找不到控制器,就停止搜素。
Route
myRoute=routes.MapRoute("myRoute","{controller}/{action}/{id}/{*catchall}",new{controller="Home",action="Index",id=UrlParameter.Optional},new[]{"MyNamespace"});
myRoute.DataTokens["UserNamespaceFallback"]=fasle;
myRoute.DataTokens["UserNamespaceFallback"]=fasle此设置会传递到控制器工厂。
10:通量匹配catch-all
catch-all允许我们匹配任意数量的段的Url
RouteTable.Routes.MapRoute("default","{query/{query-name}}/{*extrastuff}")
/query/select/a/b/c 参数{extrastuff}=a/b/c
/query/select/ 路由仍能匹配{extrastuff}=""
路由Url在与传入的请求匹配时,它的字面量与请求精确匹配的,而参数是贪婪匹配的。每个Url参数都尽可能多地匹配文本。
RouteTable.Routes.MapRoute("defalut","{filename}.{ext}")
/asp.net.mvc.xml {filename}=asp.net.mvc {ext}=xml
因为Url参数是贪婪匹配所以{filename}尽可能匹配多的文本,但需要给{ext}留下匹配的空间。
11:路由机制忽略请求的匹配
-->1:StopingRoutingHandler,在创建Route对象的时候,选择处理程序
为RouteCollection添加路由Route,如果选择StopingRoutingHandler来创建,那么就会忽略这个Route匹配的请求
StopingRoutingHandler会忽略匹配请求的Url,将这个请求传递给标准的HTTP处理程序
MvcRouteHandler会创建MVC路由对象,将这个请求传递给MvcRoute处理程序
PageRouteHandler会创建ASP.NET路由对象,将这个请求传递给PageRoute处理程序
Route axdRoute = new
Route("{resource}.axd/{*pathInfo}",
new StopRoutingHandler());
routes.Add(axdRoute);
Route
mvcRoutes = new Route("{resource}.axd/{*pathInfo}",new MvcRouteHandler());
Route pageRoutes = new Route("{resource}.axd/{*pathInfo}", new PageRouteHandler("~/Weather.aspx", true));
-->2:使用RouteCollection的扩展方法IgnoreRoute()忽略请求的Url
RouteTable.Routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
12:路由的测试
我们可以使用RouteDebugger来测试路由
13:路由生成Url
路由可以匹配请求的Url,那么也可以生成一个Url,这是一个完整的双向系统。
-->1:调用RouteCollection.GetVirtualPath(),传递一个RequestContext对象,一个包含值得字典,一个Url路由名称。
-->2:检查路由的参数是否和字典提供的值相匹配,并检查默认值,约束
-->3:依据字典提供的值,生成一个Url
-->4:溢出参数,如果字典中有多余的参数,那么这些参数会附加到Url,当作查询字符串参数
@html和@url生成链接的方法,都是调用RouteCollection.GetVirtualPath()方法。
14:路由请求管道UrlRoutingModule
-->1:UrlRoutingModule使用在RouteTable中注册的路由匹配当前请求。
-->2:匹配成功,路由模块从匹配成功的路由对象Route中获取IRouteHandler接口对象,一般MvcRouteHandler类就是这个实现。
-->3:路由模块调用IRouteHandler接口的(就是MvcRouteHandler的实例)GetHandler()方法,返回用来处理请求的IHttpHandler对象,一般是MvcHandler。
-->4:调用实现IHttpHandler接口的HTTP处理程序对象的ProcessRequest()方法,将要处理的请求传递给她。
-->5:ASP.NETMVC中,MvcRouteHandler类就是IRouteHandler的实现,MvcRouteHandler返回一个实现了IHttpHandler接口的MvcHandler对象。MvcHandler对象用来实例化控制器类,调用控制器上面的方法。
15:路由数据RouteData
RouteCollection继承自RouteBase,RouteBase定义了GetVirtualPath()方法和GetRouteData()方法,GetRouteData()方法,返回包含路由数据的字典对象RouteData
asp.net MVC 路由机制 Route的更多相关文章
- asp.net MVC 路由机制
1:ASP.NET的路由机制主要有两种用途: -->1:匹配请求的Url,将这些请求映射到控制器 -->2:选择一个匹配的路由,构造出一个Url 2:ASP.NET路由机制与URL重写的区 ...
- Asp.net MVC路由机制
C:/Windows/Microsoft.NET/Framwork/v4.0.30319/config/web.config-> httpModules-> System.Web.Rout ...
- ASP.NET没有魔法——ASP.NET MVC 路由的匹配与处理
ASP.NET MVC的路由是MVC应用的一个核心也是MVC应用处理的入口,作为一个开发者,在正常情况下仅仅需要做的就是根据需求去定义实体.业务逻辑,然后在MVC的Controller中去调用.Vie ...
- 【ASP.NET MVC系列】浅谈ASP.NET MVC 路由
ASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作 ...
- 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 路由(五)
ASP.NET MVC 路由(五) 前言 前面的篇幅讲解了MVC中的路由系统,只是大概的一个实现流程,让大家更清晰路由系统在MVC中所做的以及所在的位置,通过模糊的概念描述.思维导图没法让您看到路由的 ...
- Asp.Net MVC 路由 - Asp.Net 编程 - 张子阳
http://cache.baiducontent.com/c?m=9d78d513d98316fa03acd2294d01d6165909c7256b96c4523f8a9c12d522195646 ...
随机推荐
- RabbitMQ基本管理(上)
1.1.2 显示RabbitMQ进程 查看RabbitMQ进程信息,输入以下命令: <span style="font-size:18px;"><strong& ...
- 接口自动化测试:参数化封装(excel文件读取)
log4j.properties文件配置 log4j.rootLogger = DEBUG,stdout,F log4j.appender.stdout = org.apache.log4j.Cons ...
- TDD(测试驱动开发)
TDD(测试驱动开发)培训录 2014年我一直从事在敏捷实践咨询项目,这也是我颇有收获的一年,特别是咨询项目的每一点改变,不管是代码质量的提高,还是自组织团队的建设,都能让我们感到欣慰.涉及人的问题都 ...
- Android性能优化:谈话Bitmap内存管理和优化
最近除了那些忙着项目开发的事情,目前正在准备我的论文.短的时间没有写博客,今晚难得想总结.只要有一点时间.因此,为了凑合用,行.唠叨罗嗦,直接进入正题. 从事Android自移动终端的发展,想必是常常 ...
- AutoCAD 2012安装错误,与.net framework (1603错误)以及ms2005vc++的问题。
首先,这是AutoCAD2012的问题.因为,如果一台计算机已经安装了这些软件,AutoCAD是无法识别出来,因此AutoCAD就只能报错.正确的做法是:如果检测到这些软件已经被安装,则需要忽略这些问 ...
- Java 多线程之内存一致性错误
当不同的线程针对相同的数据却读到了不同的值时就发生了内存一致性错误.内存一致性错误的原因是非常复杂的.幸运的是我们程序员不需要详细的理解这些原因,我们需要做的事情就是使用策略来规避这些. 避免内存一致 ...
- 2.2 LINQ中使用from子句指定数据源
数据源是LINQ查询中必不可少的元素,数据源是实现泛型接口IEnumerable<T>或IQueryable<T>的类对象. 可以将IEnumerable<T>简单 ...
- Spring Resources之介绍和资源接口
1.介绍 不幸的是Java的标准的java.net.URL类和针对不同的URL前缀的标准处理器都不够充分去访问所有的低级资源.例如,美誉标准化的URL实现可能用于去范围需要从classpath中或者相 ...
- ylb:SQLServer常用系统函数-字符串函数、配置函数、系统统计函数
原文:ylb:SQLServer常用系统函数-字符串函数.配置函数.系统统计函数 ylbtech-SQL Server:SQL Server-SQLServer常用系统函数 -- ========== ...
- 由于检索用户的本地应用程序数据路径时出错,导致无法生成 SQL Server 的用户实例
/”应用程序中的服务器错误. 由于检索用户的本地应用程序数据路径时出错,导致无法生成 SQL Server 的用户实例.请确保该用户在此计算机上有本地用户配置文件.该连接将关闭. 堆栈跟踪: [Sql ...