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参数是可选的。你可以注册具有不同名称的多个自定义路由。考虑下面的例子,我们注册“学生”路由。
示例:自定义路由
- <span style="font-family:KaiTi_GB2312;font-size:18px;">public class RouteConfig
- {
- public static void RegisterRoutes(RouteCollection routes)
- {
- routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
- routes.MapRoute(
- name: "Student",
- url: "students/{id}",
- defaults: new { controller = "Student", action = "Index"}
- );
- routes.MapRoute(
- name: "Default",
- url: "{controller}/{action}/{id}",
- defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
- );
- }
- }
- </span>
MVC框架按顺序评估每个路由。它从第一个配置的路由开始,如果传入的url不符合路由的URL模式,那么它将评估第二个路由等等。在上面的例子中,路由引擎将首先评估students路由,如果传入的网址不是以/students开始,那么只有它将考虑作为默认路由的第二路由。
路由约束:
通过配置路由约束来限制参数的值。例如,以下路由对id参数应用限制,即id的值必须是数字。
- <span style="font-family:KaiTi_GB2312;font-size:18px;">routes.MapRoute(
- name: "Student",
- url: "student/{id}/{name}/{standardId}",
- defaults: new { controller = "Student", action = "Index", id = UrlParameter.Optional, name = UrlParameter.Optional, standardId = UrlParameter.Optional },
- constraints: new { id = @"\d+" }
- );</span>
注册路由
在配置RouteConfig类中的所有路由之后,需要将其注册到Global.asax的Application_Start()事件中。这样它就可以将所有的路由包含到RouteTable中。
- <span style="font-family:KaiTi_GB2312;font-size:18px;">public class MvcApplication : System.Web.HttpApplication
- {
- protected void Application_Start()
- {
- RouteConfig.RegisterRoutes(RouteTable.Routes);
- }
- }</span>
小结
要点:
(1)路由在MVC框架中起着重要的作用。将URL映射到物理文件或类(MVC中的控制器类)。
(2)路由包含URL模式和处理程序信息。网址格式在域名后面开始。
(3)路由可以在RouteConfig类中配置。还可以配置多个自定义路由。
(4)路由约束对参数的值应用限制。
(5)路由必须在Global.ascx.cs文件的Application_Start事件中注册。