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
对象。