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

请注明转载地址:http://www.cnblogs.com/arhat浏览器

因为今天是星期六,因此多写几篇,感受前几天的忙碌没有及时发布文章,趁着周末老魏尽力的多写几篇文章。由于本系列基本上快结束了,因此老魏也要加把劲了,这个系列完成后,老魏会开始NHibernate,Spring.NET,EF等相关文章的书写。但愿你们可以支持一下!服务器

本章老魏主要给你们讲述一下在ASP.NET MVc3中的路由技术,固然本章属于那种不会也会开发ASP.NET MVC的章节,可是老魏仍是建议你们要学习一下这个路由技术,这样你们会理解ASP.NET 
MVC的生命周期,同时可以避免你们走不少弯路。app

当咱们建立一个ASP.NET MVC3项目的时候,咱们会发如今项目中有一个Global.asax文件,这个文件它包含了ASP.NET应用程序生命周期事件处理,当应用程序启动的时候会先运行这个文件中的Application_Start方法。
咱们来看看Global.asax文件的代码:学习

public class MvcApplication : System.Web.HttpApplication

    {

public static void RegisterGlobalFilters(GlobalFilterCollection filters)

        {

            filters.Add(new HandleErrorAttribute());

        }

public static void RegisterRoutes(RouteCollection routes)

        {

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

            routes.MapRoute(

"Default", // 路由名称

"{controller}/{action}/{id}", // 带有参数的 URL

new { controller = "Home", action = "Index", id = UrlParameter.Optional } // 参数默认值

            );

        }

protected void Application_Start()

        {

AreaRegistration.RegisterAllAreas();

            RegisterGlobalFilters(GlobalFilters.Filters);

            RegisterRoutes(RouteTable.Routes);

        }

}

当一个ASP.NET MVC应用程序第一次运行时, Application_Start()方法被调用。这个方法,又调用RegisterRoutes()方法,RegisterRoutes()方法建立了路由表。测试

记得当时老魏在学习路由的时候很是的迷惑,不理解什么是路由,但慢慢的理解什么路由。所谓的路由就是至关于一个路由器,用来分配和匹配用的。好比咱们的计算机(A)由路由器分配一个地址“192.168.1.23”,那么若是这个计算机须要访问“192.168.1.128”的计算机(B),那么A计算机须要把他请求的地址发送给路由器,而路由器接收到这地址以后,从路由表中开始查找计算机B的地址,若是B的地址在路由器中的路由表中注册过,则路由器把A的请求发送给B,若是路由器没有找到B在路由表中注册的地址,那么发送不成功!this

那么,在ASP.NET MVC中的路由也是这个意思,只不过不是访问的计算机,而是访问的是控制下Action。那么咱们能够仿照上面的描述来描述一下ASP.NET MVC的路由过程。好比如今有一个控制器A(/Home/Index)须要访问控制器B(/About/Index)那么,在页面中,咱们点击超连接:url

<a href=”/About/Index”>About</a>,那么这个超连接将会向服务器发送一个请求,这个请求被Global.asax接收,由于Global.asax中已经注册过了路由,那么则接收到这个请求的时候,路由表中就会查找这个地址”/About/Index”,若是找到了,在开始访问,没有找到则会404。spa

因此,从上面的描述中,咱们知道,在Global.asax的RegisterRoutes方法是用来注册访问路由的。在路由表中注册的路由就是访问的地址规则,若是访问的地址知足了地址规则才会访问,不然错误!code

咱们能够经过一张图来看一下这个过秤。blog

wps_clip_image-17269

从这个图中,咱们看到MVC下的请求过程,其实你们也看到了,在这个请求过程当中,Global.asax的路由系统起到一个很是重要的做用,那么下面咱们来看看它是如何来匹配浏览器发送过来的请求,执行这个请求。

在Global.asax的RegisterRoutes方法中注册了路由规则,这个规则用来匹配浏览器发送过来的请求,默认状况下,这个方法里面已经注册了一个默认的路由。

public static void RegisterRoutes(RouteCollection routes)

     {

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

            routes.MapRoute(

"Default", // 路由名称

"{controller}/{action}/{id}", // 带有参数的 URL

new { controller = "Home", action = "Index", id = UrlParameter.Optional } // 参数默认值

            );

      }

这个方法中传入一个参数RouteCollection集合,这个集合中就是路由表用来保存路由规则的。经过方法MapRoute方法来增长一条路由规则。这个方法重载了6次,那么根据不一样的需求调用不一样的方法。那么本章咱们将讲解经常使用的方法,后面的方法咱们在后续的章节中讲解。

public static Route MapRoute(this RouteCollection routes, string name, string url);        

public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults);        

public static Route MapRoute(this RouteCollection routes, string name, string url, string[] namespaces);        

public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, object constraints);      

public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, string[] namespaces);     

public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, object constraints, string[] namespaces);

其中,默认路由用的是第二个方法。咱们来分析一个这个方法。

public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults);

参数:

name:路由的名字

url:路由规则

Defaults:路由的默认值

那么,咱们看看默认的路由。

routes.MapRoute(

"Default", // 路由名称

"{controller}/{action}/{id}", // 带有参数的 URL

new { controller = "Home", action = "Index", id = UrlParameter.Optional } // 参数默认值

            );

首先,路由的名称是Default,路由的规则是"{controller}/{action}/{id}",路由的默认值 new { controller = "Home", action = "Index", id = UrlParameter.Optional }。

咱们来分析一下路由的规则,默认的路由规则是"{controller}/{action}/{id}",那么也就是说,浏览器发送过来的请求必须是contrroller开头/action中间/id参数,这样的形式。那么咱们写几个来匹配一下。

访问地址:/Home/Index/1 —— /controlller/action/id——匹配

访问地址:/Home/Index——/Controlller/action/id——匹配

访问地址:/Home/Index/apple——/Controlller/action/id——匹配

访问地址:/Home/Index/1/2 —— /controlller/action/id——不匹配

咱们用上面的例子来匹配默认的路由,那么经过上面的例子,咱们会发现一个问题,为何第二个和第三个可以匹配成功呢?路由规则中配置了有一个id的参数,怎么没有传递就成功呢?缘由是,在默认之中,设置了Id的默认值,因此若是没有传递参数也是能够的。但是为何传递的apple也能成功呢?由于在http协议中传递的参数类型都是string类型的。

那么,若是如今项目中,没有AboutController控制器,那么咱们在浏览器中输入下面的地址:

访问地址:/About/Index —— /controlller/action/id——匹配

首先,访问的地址匹配了路由规则,因为在项目中没有这个控制器,则路由表就找不到对应的控制器去执行,因此回报错。

wps_clip_image-20159

如今咱们来分析一下第三个参数,也就是路由规则的默认值。

new { controller = "Home", action = "Index", id = UrlParameter.Optional }

这个默认值的做用是,若是在浏览器中输入http://localhost,那么将会调用默认的路由规则,同时把默认值做为请求的内容。也就说说,咱们访问http://localhost就是访问http://localhost/Home/Index。这个就是默认值的做用。

其实在访问的过程当中,最重要的就是默认的规则,只要你访问的地址可以匹配路由规则,则按照路由规则和请求的内容来访问,不然则按照默认值来访问。好比咱们访问/About/Index这个地址时候,知足了匹配的规则,那么请求的内容就是AboutController和Index方法,则默认值将不会起做用了。

经过上面的分析,咱们明白了路由的做用,那么咱们能不能本身添加一个路由规则呢?答案是确定的,咱们能够自定义路由,可是须要注意的是自定义路由必须位于默认路由的前面,由于ASP.NET MVC默认状况下寻找路由的时候是从上到下进行匹配的。

好,咱们添加一个路由。

routes.MapRoute(

"MyRoute", // 路由名称

"{action}", // 带有参数的 URL

new { controller = "About", action = "Index"} // 参数默认值

            );

咱们添加的这个路由很是的简单,理由名称是MyRoute,路由规则就一个{action},而后下面是默认值,咱们的默认值是控制器About,Action为Index没有参数。

那么咱们试着猜测一下,若是咱们在浏览器中输入http://localhost/Index的时候,是否是访问的是AboutController/Index方法呢?答案是确定的,由于咱们符合了这个规则。

这里咱们须要注意的是,默认值中,咱们必须设置controller和action的默认值。那么咱们在定义一个路由。

routes.MapRoute(

"Display", // 路由名称

"Dispaly/{controller}/{action}", // 带有参数的 URL

new { controller = "About", action = "Index" } // 参数默认值

             );

这个路由的匹配规则是Display/{controller}/{action}那么咱们在浏览器中输入下面的地址http://localhost:4878/Display/about/index就是匹配规则的。那么咱们在输入一个地址http://localhost:4878/Display/home/index这个地址也是匹配的,不过是这个地址没有用默认值而已。

讲到这里,不知道你们有没有明白路由和自定义路由呢?但愿你们可以看得明白,并可以灵活应用起来。

同时,你们能够经过在View中生成ActionLink来作一下测试。可是这里得提醒你们一下,若是没有特别的说明,请不要自定义路由!

相关文章
相关标签/搜索