繼續往下看《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框架揭秘》中,只是做內容的梳理和總結。