ASP.NET MVC路由解析

版权所有,禁止匿名转载;禁止商业使用。

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


0 0