代码改变世界

ASP.NET MVC路由解析

2015-01-27 11:25  Fururur  阅读(2334)  评论(6编辑  收藏  举报

继续往下看《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框架揭秘》中,只是做内容的梳理和总结。