MVC框架路由的讲解

  在ASP.NET Web窗体应用程序中,每个URL都必须与特定的.aspx文件匹配。例如,URL地址: http://domain/studentsinfo.aspx必须与包含用于呈现对浏览器的响应的代码和标记的文件studentinfo.aspx相匹配。

叙述

   ASP.NET引入了路由,以消除将每个URL映射到物理文件的需求。路由使我们能够定义映射到请求处理程序的URL模式。这个请求处理程序可以是一个文件或类。在ASP.NETWebform应用程序中,请求处理程序是.aspx文件,而在MVC中,它是Controller类和Action方法。例如,http://domain/students可以映射到ASP.NET Webforms中的http://domain/studentsinfo.aspx,并且可以将相同的URL映射到MVC中的Student Controller和Index操作方法。

   URL路由不是MVC独有的,相反它是独立于MVC而单独存在的(在System.Web.Routing下)。因此,URL路由也能为传统的ASP.NET应用程序服务 

路由:

   路由定义了URL模式和处理程序信息。存储在RouteTable中的应用程序的所有已配置路由将由路由引擎用于为传入请求确定适当的处理程序类或文件。

下图说明了路由过程


配置路由:

   每个MVC应用程序必须配置(注册)至少一个默认由MVC框架配置的路由。您可以在RouteConfig类中注册路由,该路由位于App_Start文件夹下的RouteConfig.cs中。下图说明了如何在RouteConfig类中配置路由。


   如上图所示,路由使用RouteCollection的MapRoute()扩展方法进行配置,其中名称为“Default”,url模式为“{controller}/{action}/{id}”,defaults参数为控制器,操作方法和id参数。如果传入请求URL中不存在,则默认值指定应使用哪个控制器,操作方法或ID参数值。

URL模式:

   URL模式仅在URL中的域名部分之后被考虑。例如,网址格式“{controller}/{action}/{id}”看起来像localhost:1234/{controller}/{action}/ {id}。“localhost:1234 /”之后的任何内容都将被视为控制器名称。同样,控制器名称之后的任何内容都将被视为操作名称,然后是id参数的值。


多重路由

   使用MapRoute扩展方法配置自定义路由。在MapRoute中提供至少两个参数,路由名称和url模式。Defaults参数是可选的。你可以注册具有不同名称的多个自定义路由。考虑下面的例子,我们注册“学生”路由。

示例:自定义路由

[csharp]  view plain  copy
  1. <span style="font-family:KaiTi_GB2312;font-size:18px;">public class RouteConfig  
  2. {  
  3.     public static void RegisterRoutes(RouteCollection routes)  
  4.     {  
  5.         routes.IgnoreRoute("{resource}.axd/{*pathInfo}");  
  6.   
  7.         routes.MapRoute(  
  8.             name: "Student",  
  9.             url: "students/{id}",  
  10.             defaults: new { controller = "Student", action = "Index"}  
  11.         );  
  12.   
  13.         routes.MapRoute(  
  14.             name: "Default",  
  15.             url: "{controller}/{action}/{id}",  
  16.             defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }  
  17.         );  
  18.     }  
  19. }   
  20. </span>  
   如上面的代码所示,Student路由的URL模式是students/{id},它指定任何以domainName/students开头的URL都必须由StudentController处理。请注意,我们还没有在URL模式中指定{action},因为我们希望每个以student开头的URL都应该使用StudentController的Index操作。我们已经指定了默认的控制器和动作来处理从域名/学生开始的任何URL请求。
   MVC框架按顺序评估每个路由。它从第一个配置的路由开始,如果传入的url不符合路由的URL模式,那么它将评估第二个路由等等。在上面的例子中,路由引擎将首先评估students路由,如果传入的网址不是以/students开始,那么只有它将考虑作为默认路由的第二路由。

路由约束:

   通过配置路由约束来限制参数的值。例如,以下路由对id参数应用限制,即id的值必须是数字。

[html]  view plain  copy
  1. <span style="font-family:KaiTi_GB2312;font-size:18px;">routes.MapRoute(  
  2.         name: "Student",  
  3.         url: "student/{id}/{name}/{standardId}",  
  4.         defaults: new { controller = "Student"action = "Index"id = UrlParameter.Optional, name = UrlParameter.Optional, standardId = UrlParameter.Optional },  
  5.         constraints: new { id = @"\d+" }  
  6.     );</span>  
  如果你给id参数的非数字值,那么这个请求将被另一个路由处理,或者如果没有匹配的路由,则会抛出“The resource could not be found”错误。

注册路由

   在配置RouteConfig类中的所有路由之后,需要将其注册到Global.asax的Application_Start()事件中。这样它就可以将所有的路由包含到RouteTable中。

[csharp]  view plain  copy
  1. <span style="font-family:KaiTi_GB2312;font-size:18px;">public class MvcApplication : System.Web.HttpApplication  
  2.     {  
  3.         protected void Application_Start()  
  4.         {  
  5.               RouteConfig.RegisterRoutes(RouteTable.Routes);  
  6.         }  
  7.     }</span>  
下面表示注册路由的过程


小结

   要点:

(1)路由在MVC框架中起着重要的作用。将URL映射到物理文件或类(MVC中的控制器类)。
(2)路由包含URL模式和处理程序信息。网址格式在域名后面开始。
(3)路由可以在RouteConfig类中配置。还可以配置多个自定义路由。
(4)路由约束对参数的值应用限制。
(5)路由必须在Global.ascx.cs文件的Application_Start事件中注册。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值