MVC3中的路由系统(Routes)

转载:http://blog.csdn.net/francislaw/article/details/7429317

MVC中,用户访问的地址并不映射到服务器中对应的文件,而是映射到对应Control里对应的ActionMethod,由ActionMethod 来决定返回用户什么样的信息。而把用户访问的地址对应到对应的Action(当然也可以是对应的文件)的工作有路由系统完成,这其中许多复杂的处理 由.net自动完成,而开发者需要告诉.net用户的访问地址和对应Action的具体映射关系。

MVC中路由系统可以完成两件任务:

1,处理从用户接收到得URL,映射到对应的Action;

2,将某个Action根据路由系统的映射关系,反映射成符合该路由系统结构的URL(动态生成URL,当网站结构改变时,该URL同样会自动改变);

一,处理incoming的URL:

路由的具体映射关系是在Global.aspx文件里定义的:

public static void RegisterRoutes( RouteCollection routes)

{

routes.IgnoreRoute( "{resource}.axd/{*pathInfo}" );

routes.MapRoute(

null,

"",// null route

new { controller = "Product" ,
action = "List", category = ( string)null , page
= 1 },

new[] { "SportsStore.WebUI.Controllers" }

);

routes.MapRoute(

null,

"Page{page}", // Matches /Page2, /Page123, but not /PageXYZ

new { controller = "Product" ,
action = "List", category = ( string)null },

new { page = @"\d+" } //
Constraints: page must be numerical

);

routes.MapRoute(

null,

"{category}", // Matches /Football or /AnythingWithNoSlash

new { controller = "Product" ,
action = "List", page = 1 }

);

routes.MapRoute(

null,

"{category}/Page{page}", // Matches /Football or /AnythingWithNoSlash/Page1

new { controller = "Product" ,
action = "List", page = 1 },

new { page = @"\d+" } //
Constraints: page must be numerical

);

routes.MapRoute(

"Default", // Route name

"{controller}/{action}/{id}" , // URL with parameters

new { controller = "Product" ,
action = "List", id = UrlParameter.Optional } // Parameter defaults

);

}

在系统启动时,Application_Start()方法会调用RegisterRoutes方法,开发者自定义的路由映射就在RegisterRoutes方法中。

1,自定义Route并添加到RouteTable中:

Route myRoute = new Route("{controller}/{action}", new MvcRouteHandler());
     routes.Add("MyRoute", myRoute);

2,通过Routes.MapRoute方法(其内部仍然自定义了一个Route添加)

routes.MapRoute(

"RouteName",                                                                           // 第一个参数指定为新建的Route的名称;

"ABC{category}/{controller}/Page{page}/DEF",              //第二个参数为主要的映射关系

new { controller = "Product" ,
action = "List", page = 1 },    // 第三个参数为默认参数,当映射不匹配时,会根据此默认参数进行Action的匹配

new { page = @"\d+" },    
                                                  //第四个参数为相关限制条件,此处表示page参数必须是数字

new {”NameSpace“}                                                              // 第五个参数为命名空间,即该路由匹配在那个命名空间下有效

);

第二个参数中, "ABC{category}/{controller}/Page{page}/DEF",路由系统会根据此处的参数,把用户请求的URL和这里的参数进行匹配,有两种映射匹配方式:

①动态匹配,放在{}里的,即为要匹配的参数名,比如category,controller,page,URL中,在ABC之后,第一个/之前的内容
均会被匹配并”赋值“给category参数。同理,第二个/到第三个/之间的内容会被匹配为controler参数的值,即到此controller里
需找对应的ActionMethod。

②静态匹配,放在{}以外的内容,会将此处每一个字符同URL进行比较,比如ABC.../.../PAGE..../DEF

如果URL和该参数的①和②两种比较方式比均均匹配成功,则为完全匹配成功,按URL进行相应的Controller和Action进行匹配,否则,未匹配成 功的项:比如page,会按默认的参数去匹配Action,如果默认参数匹配不成功,则抛出异常

当注册了多个RouteMap时,会按其注册的顺序,从上到下进行匹配,匹配成功后不会再查找后面的匹配。在设计路由匹配时要注意匹配的前后顺序;

二,将对应的Action转换为URL

路由系统的第二个功能就是实现把某个Action转换为对应的URL。当然可以在代码中写静态的URL,但当网站的路由映射系统发生改变时,该静态URL需要全部修改,利用路由系统可以实现动态转换

1,生成链接:<a>

@Html.ActionLink("About this application", "Index", "Home",new {id =
"myAnchorID", @class = "myCSSClass"})第四个参数可以为生成的链接提供属性;
当提供的参数和路由系统中的参数不一致时,会生成QueryString:?..=..

2,生成URL字符串:仅仅产生URL的字符串,即href后的内容

@Html.Action(),用法同ActionLink一致。

时间: 2024-10-29 02:41:23

MVC3中的路由系统(Routes)的相关文章

第六篇 Flask中的路由系统

Flask中的路由系统其实我们并不陌生了,从一开始到现在都一直在应用 @app.route("/",methods=["GET","POST"]) 为什么要这么用?其中的工作原理我们知道多少? 一.@app.route() 装饰器中的参数 methods :当前 url 地址,允许访问的请求方式 @app.route("/info", methods=["GET", "POST"]) d

Flask中的路由系统

Flask中的路由系统其实我们并不陌生了,从一开始到现在都一直在应用 @app.route("/",methods=["GET","POST"]) 至于为什么这么使用,马上开始介绍 [email protected]() 装饰器中的参数 (1).methods: 当前url地址,允许访问的请求方式,默认支持"GET", 如果想加入新的请求方式,就必须加上"GET" USER = {"usernam

asp.net中的路由系统

ASP.NET MVC重写了ASP.NET管道HttpModule和处理程序HttpHandler.MVC自定义了MvcHandler实现了Controller的激活和Action的执行.但是在请求到达这里之前把Http请求Url解析到正确的Controller和Action上,是通过自定义HttpModule来实现的,这个自定义的HttpModule就是Url路由系统UrlRoutingModule. 1:UrlRoutingModule拦截请求的Url,对Url进行解析,得到以Control

简单实例一步一步帮你搞清楚MVC3中的路由以及区域

我们都知道MVC 3 程序的所有请求都是先经过路由解析然后分配到特定的Controller 以及 Action 中的,为什么这些知识讲完了Controller Action Model 后再讲呢?这个东西我个人感觉比较的抽象吧!如如您有基础,看起来一点也不费力,如果您没有基础的话,您连Controller  Action 都不知道是什么,那您怎么理解路由呢?嘿嘿仅仅是个人的看法!如果您还没有了解MVC 3 的一些基本的信息请您按照我下面的导航来,先了解MVC 3 的其他知识,然后再看下这篇文章.

Flask最强攻略 - 跟DragonFire学Flask - 第七篇 Flask 中路由系统

Flask中的路由系统其实我们并不陌生了,从一开始到现在都一直在应用 @app.route("/",methods=["GET","POST"]) 为什么要这么用?其中的工作原理我们知道多少? 请关注跟DragonFire学Flask 之 路由系统 ,这里有你想要的答案 1. @app.route() 装饰器中的参数 如果不明白装饰器 点击这里 methods : 当前 url 地址,允许访问的请求方式 @app.route("/inf

Flask第六篇 Flask中路由系统

Flask中的路由系统其实我们并不陌生了,从一开始到现在都一直在应用 @app.route("/",methods=["GET","POST"]) 为什么要这么用?其中的工作原理我们知道多少? 请关注跟DragonFire学Flask 之 路由系统 ,这里有你想要的答案 1. @app.route() 装饰器中的参数 如果不明白装饰器 点击这里 methods : 当前 url 地址,允许访问的请求方式 @app.route("/inf

一步步学习ASP.NET MVC3 (14)——Route路由

由于今天是星期六,所以多写几篇,感觉前几天的忙碌没有及时发布文章,趁着周末老魏尽力的多写几篇文章.因为本系列基本上快结束了,所以老魏也要加把劲了,这个系列完成后,老魏会开始NHibernate,Spring.NET,EF等相关文章的书写.希望大家能够支持一下! 本章老魏主要给大家讲述一下在ASP.NET MVc3中的路由技术,当然本章属于那种不会也会开发ASP.NET MVC的章节,但是老魏还是建议大家要学习一下这个路由技术,这样大家会理解ASP.NET  MVC的生命周期,同时能够避免大家走很

深入理解 react-router 路由系统

范洪春 在 web 应用开发中,路由系统是不可或缺的一部分. 在浏览器当前的 URL 发生变化时,路由系统会做出一些响应,用来保证用户界面与 URL 的同步. 随着单页应用时代的到来,为之服务的前端路由系统也相继出现了. 有一些独立的第三方路由系统,比如 director,代码库也比较轻量. 当然,主流的前端框架也都有自己的路由,比如 Backbone.Ember.Angular.React 等等. 那 react-router 相对于其他路由系统又针对 React 做了哪些优化呢? 它是如何利

WebApi学习总结系列第四篇(路由系统)

由于工作的原因,断断续续终于看完了<ASP.NET Web API 2 框架揭秘>第二章关于WebApi的路由系统的知识. 路由系统是请求消息进入Asp.net WebApi的第一道屏障,其根本目的利用注册的路由表对请求的URI进行解析以确定目标HttpController和Action的名称,以及与某个Action方法某个参数进行绑定的路由变量. Asp.net webApi中的路由系统和Asp.net中的路由系统很相似,也有Route,只是WebApi的路由系统又独立于Asp.net的路由