现在项目都前后端分离了,也慢慢的抛弃MVC方式了,转战API+前端的方式。用了这么多年MVC,简单梳理下MVC中常用的一些方法及作用,在应用层面上会有一些帮助,不涉及底层原理。文章仅从方法介绍相关的功能。
一、RouteConfig.RegisterRoutes(RouteTable.Routes)
一般默认情况下,在Global中会默认调用该方法,如下:
protected void Application_Start() { AreaRegistration.RegisterAllAreas(); //注册路由 RouteConfig.RegisterRoutes(RouteTable.Routes); }
RegisterRoutes方法主体如下:
public class RouteConfig { public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); } }
该方法什么作用呢?
其实这是MVC路由模块的一部分,简单的说下,路由模块有两大部分组成,一部分是在Web.config 文件启用了 ASP.NET 路由, 配置文件中有四个部分与路由相关:system.web.httpModules 节、system.web.httpHandlers 节、system.webserver.modules 节和 system.webserver.handlers 节, 请注意不要删除这些节,否则路由将不再起作用。
另一部分就是我们现在说的RegisterRoutes方法,该方法的作用就是创建路由表, 负责将传入浏览器请求映射到特定 MVC 控制器操作。
我们再简单介绍下路由模块是如何工作的?默认路由表包含一个路由(名为 Default), 默认路由将 URL 的第一段映射到控制器名称,将 URL 的第二段映射到控制器操作,并将第三段映射到名为id的参数。比如你在 web 浏览器的地址栏中输入以下 URL:/Home/Index/3,默认路由将此 URL 映射到以下参数:
-
-
控制器 = Home
-
操作 = 索引
-
id = 3
-
请求 URL/Home/Index/3 时,将执行以下代码:HomeController.Index(3)
Default 路由包括所有三个参数的默认值。 如果不提供控制器,则控制器参数默认为值Home。 如果不提供操作,则操作参数将默认为值索引。 最后,如果不提供 id,id 参数将默认为空字符串。
二、AreaRegistration.RegisterAllAreas()方法
一般默认情况下,在Global中会默认调用该方法,如下:
protected void Application_Start() { AreaRegistration.RegisterAllAreas(); RouteConfig.RegisterRoutes(RouteTable.Routes); }
AreaRegistration.RegisterAllAreas()作用就是注册 MVC 应用程序中的所有区域。具体的说就是此方法查找从 AreaRegistration 类派生的所有类型、 实例化类型的实例并在实例上调用了 RegisterArea 方法,通过在项目中注册每个区域(要细品)。
区域干什么?每一个区域可以有Controller,View文件结构和路由配置,我们可以把区域看成嵌套的MVC,区域在项目中是常用到的,可以尝试使用理解。
我们看上边的代码,发现. RouteConfig.RegisterRoutes(RouteTable.Routes)在AreaRegistration.RegisterAllAreas()的后面。请不要更改这个顺序,原因呢?AreaRegistration.RegisterAllAreas()的作用就是注册区域,匹配Area中的路由配置规则,而 RouteConfig.RegisterRoutes(RouteTable.Routes)要根据路由配置规则来创建路由表。这两个方法是相辅相成的。
简单的说RegisterAllAreas对项目中的Area、Controller进行路由配置,然后RegisterRoutes根据前边的配置创建路由表。
三、MapMvcAttributeRoutes方法
该方法是路由集合属性路由扩展类RouteCollectionAttributeRoutingExtensions中的方法,作用呢?直白点说就是用来完成特性路由注册。什么叫特性路由?
前边介绍了我们通过RegisterRoutes创建了路由表,对于一个请求通过路由表就可以定位到相应的action。但是有些情况下URL会很复杂,如客户包含订单/costomer/{customerid}/orders,对于这种Uri,我们使用特性路由就会很方便,特性路由能够匹配传入的请求并把这些请求映射到控制器操作上。比如,在action上加一个特性即可
[Route("customer/{customerId}/orders")] public IEnumerable<Order> GetOrdersByCustomer(int customerId) { ... }
当然我们也可以利用特性路由实现以下操作:多个不同的URL要请求同一个action,比如我们想让首页通过/、/home、/home/index这几个URL都可以访问同一个action,则可以利用特性路由:
[Route("")] [Route("home")] [Route("home/index")] public ActionResult Index() { return View(); }
通过以上实例我们可以看出,特性路由就是为了满足某种URL而对action加个入口,定义的特性路由也会加入路由表。
启用特性路由首先在RegisterRoutes中开启特性路由功能:routes.MapMvcAttributeRoutes();
public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapMvcAttributeRoutes();//启用特性路由 routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); }
四、待补充