RouteTable翻译过来的意思就是路由表,一个Web应用程序具有一个全局的路由表,该路由表通过System.Web.Routiing.RouteTable的静态只读属性Routes表示,该类型返回一个类型为System.Web.Routingg.RouteCollection的集合。
RouteTable类十分的简单,如下所示
public class RouteTable { private static RouteCollection _instance = new RouteCollection(); //返回一个静态只读的RouteCollection类型实例 public static RouteCollection Routes { get { return RouteTable._instance; } } public RouteTable() { } }
现在我们来看一下运行时的状态
public class MvcApplication : System.Web.HttpApplication { protected void Application_Start() { AreaRegistration.RegisterAllAreas(); RouteConfig.RegisterRoutes(RouteTable.Routes); //断点1 } }
下图就是当断点处于断点1时,RouteTable的状态 ,我们在这里可以很清楚的看到现在Routes属性所包含的路由条数为0,不急我们继续向下走。
2.RouteCollection
看到名称就不难猜到,这个应该是表示路由集合,我们先来看看这个类里面有什么新奇玩意。
public class RouteCollection : Collection<RouteBase> { //其余省略 //是否添加首尾斜杠.默认值为 false. public bool AppendTrailingSlash { get; set; } //是否将 URL 转换为小写.默认值为 false. public bool LowercaseUrls { get; set; } //是否应处理与现有文件匹配的 URL.默认值为 false. public bool RouteExistingFiles { get; set; } //获取路由信息 public RouteData GetRouteData(HttpContextBase httpContext); //获取虚拟路径信息 public VirtualPathData GetVirtualPath(RequestContext requestContext, string name, RouteValueDictionary values); //忽略路由URL和相关约束 public void Ignore(string url, object constraints); //添加路由 public Route MapPageRoute(string routeName, string routeUrl, string physicalFile, bool checkPhysicalUrlAccess, RouteValueDictionary defaults, RouteValueDictionary constraints, RouteValueDictionary dataTokens); }
稍微了解了这个类是用来干什么的,那么我们就要接着上面的程序向下走了,当然先介绍以下RouteBase和Route类吧
3.RouteBase,Route
在上图中我们看到了RouteBase,Route类,来说一下它们是什么吧。
RouteBase
RouteBase是Route类的父类,我们还是来看下它的类结构吧
public abstract class RouteBase { private bool _routeExistingFiles = true; // 指示 ASP.NET 路由操作是否应处理与物理文件匹配的 URL,这里默认是True,即可以使用WebForm方式请求物理文件,但是在MSDN中描述 //这个属性的默认值为False public bool RouteExistingFiles { get { return this._routeExistingFiles; } set { this._routeExistingFiles = value; } } // 获取路由信息,保存在RouteData中 public abstract RouteData GetRouteData(HttpContextBase httpContext); // 获取虚拟路径信息,保存在VirtualPathData中 public abstract VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values); }