继续往下看《ASP.NET MVC5框架揭秘》。
ASP.NET系统通过注册路由和现有的物理文件路径发生映射。而对于ASP.NET MVC来说,请求的是某个Controller中的具体的Action方法。
路由注册和忽略的方法与ASP.NET不同,位于RouteCollectionExtensions中。
routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } );
UrlParameter.Optional表示只有请求的URL真正包含具体变量值时RouteData里才会有相应的变量存储。
Area路由映射
场景:假设在Controller下有一个文件夹api,里面包含了用来调用的api。而且api目录下的Controller可能包含和Controller目录下相同命名的Controller。
这个时候可以通过AreaRegisteration来实现。AreaRegisteration是一个抽象类。
public abstract class AreaRegistration { protected AreaRegistration(); public abstract string AreaName { get; } public static void RegisterAllAreas(); public static void RegisterAllAreas(object state); public abstract void RegisterArea(AreaRegistrationContext context); }
建一个ApiAreaRegisteration,实现抽象方法和属性。
public class ApiAreaRegisteration :AreaRegistration {
//返回一个Area名 public override string AreaName { get { return "api"; } } public override void RegisterArea(AreaRegistrationContext context) { object defaults = new { Controller = "utility", Action = "Add", num = 1 }; context.MapRoute("apidefault","api/{controller}/{action}/{num}",defaults,new string[]{"MvcTest.Controllers.api"}); } }
在global.asax里注册
protected void Application_Start() { AreaRegistration.RegisterAllAreas(); }
AreaRegistrationContext 是对应的上下文包含AreaName、Routes等信息和一系列注册路由的方法。
调用AreaRegistration.RegisterAllAreas()静态方法后,会反射创建ApiAreaRegisteration 对象,调用RegisterArea()方法实现路由注册。
注:本博文大多数内容来自《ASP.NET MVC5框架揭秘》中,只是做内容的梳理和总结。