2.RouteData
我们现在来看看用于封装路由数据同时作为GetRouteData方法返回值的RouteData。如下面代码片段所示,RouteData具有一个类型为RouteBase的属性Route,该属性返回生成此RouteData的Route对象。不过这是一个可读/写的属性,我们可以使用任意一个Route对象来对此属性进行赋值。
public class RouteData { public RouteData(); public RouteData(RouteBase route,IRouteHandler routeHandler); public string GetRequiredString(string valueName); public RouteBase Route { set; get; } public IRouteHandler RouteHandler { set; get; } public RouteValueDictionary Values { get; } public RouteValueDictionary DataTokens { get; } }
RouteData的Values和DataTokens属性都返回一个RouteValueDictionary的对象。RouteValueDictionary是一个实现了IDictionary<string,object>接口的字典。ASP.NET路由系统利用此对象来保存路由变量,字典元素Key和Value分别表示变量的名称和值。存储于Values和DataTokens这两个属性中的路由变量的不同之处在于:前者通过对请求URL进行解析得到的,后者则是直接附加到路由对象上的自定义变量。
在某些路由场景中,我们要去Route针对请求进行路由解析得到的变量集合(Values属性)中必须包含某些固定名称的变量值(比如ASP.NET MVC应用中表示Controller和Action名称的变量),RouteData的GetRequiredString方法用于获取他们的值。对于该方法的调用,如果指定名称的变量在Values属性中不存在,它会直接抛出一个InvalidOperationException异常。
RouteData通过其RouteHandler属性返回一个RouteHandler对象。RouteHandler在整个路由系统中具有重要的地位,因为最终用于处理请求的HttpHandler对象由它提供,所有的RouteHandler类型均实现了具有如下定义的IRouteHandler接口,HttpHandler的提供实现在它的GetHttpHandler方法中。我们可以在构造函数中对RouteData的RouteHandler属性进行初始化,也可以直接对这个可读/写的属性进行赋值。
public interface IRouteHandler { IHttpHandler GetHttpHandler(RequestContext requestContext); }
当请求被成功路由到某个.aspx页面后,通过调用匹配Route对象的GetRouteData方法生成的RouteData被直接附加到目标页面对应的page对象上。Page具有一个类型为RouteData的同名只读属性,它返回的正是这个RouteData对象。