Route和RouteTable
ASP.NET路由系统的核心是注册的Route对象,一个Route对象对应着一个路由模板,多个具有不同URL模式的Route对象可以注册到同一个Web应用中,他们构成了一个路由表。这个包含所有注册Route对象的路由表通过RouteTable类的静态属性Routes表示,该属性返回一个RouteCollection对象。
1.RouteBase
我们所说的Route泛指的是继承自抽象类RouteBase的某个类型的对象。RouteBase具有两个返回类型分别为RouteData和VirtualPathData的方法GetRouteData和GetVirtualPath,他们分别体现了针对两个“方向”的路由。实现在GetRouteData方法中的路由解析是为了获取路由数据,而GetVirtualPath方法则通过路由解析生成一个完整的虚拟路径。
public abstract class RouteBase { public abstract RouteData GetRouteData(HttpContextBase httpContext); public abstract VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values); public bool RouteExistingFiles { set; get; } }
借助路由我们可以采用一个与路径无关的URL来访问某个物理文件。但是如果我们就是希望以物理路径的方式来访问对应的物理物理文件,那该怎么办呢?以前面演示的实例来说,我们注册了一个路由模板为“/employees/{name}/{id}”的Route,但是我们在目录“/employees/hr”下放置了一个名为Default.aspx的页面用于显示HR部门的员工信息。对于这样一个URL“/employees/hr/default.aspx”,他与注册路由对象的模板是完全匹配的,如果ASP.NET总是对采用次URL的请求实施路由,则意味着我们不能以真实的物理路径来访问这个页面了。
为了解决这个问题,RouteBase定义了一个布尔类型的属性RouteExistingFiles,如果 ASP.NET 路由操作处理所有请求(甚至包括与现有文件匹配的请求),则为 true;否则为 false。 默认值为 false。意味着默认情况下在我们的实例中通过地址“/employees/hr/default.aspx”是可以访问到Default.aspx页面文件的。