学习ASP.NET MVC5框架揭秘笔记-ASP.NET路由(四)

2.RouteData

我们现在来看看用于封装路由数据同时作为GetRouteData方法返回值的RouteData。如下面代码片段所示,RouteData具有一个类型为RouteBase的属性Route,该属性返回生成此RouteDataRoute对象。不过这是一个可读/写的属性,我们可以使用任意一个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; }
}

RouteDataValuesDataTokens属性都返回一个RouteValueDictionary的对象。RouteValueDictionary是一个实现了IDictionary<string,object>接口的字典。ASP.NET路由系统利用此对象来保存路由变量,字典元素KeyValue分别表示变量的名称和值。存储于ValuesDataTokens这两个属性中的路由变量的不同之处在于:前者通过对请求URL进行解析得到的,后者则是直接附加到路由对象上的自定义变量。

在某些路由场景中,我们要去Route针对请求进行路由解析得到的变量集合(Values属性)中必须包含某些固定名称的变量值(比如ASP.NET MVC应用中表示ControllerAction名称的变量),RouteDataGetRequiredString方法用于获取他们的值。对于该方法的调用,如果指定名称的变量在Values属性中不存在,它会直接抛出一个InvalidOperationException异常。

RouteData通过其RouteHandler属性返回一个RouteHandler对象。RouteHandler在整个路由系统中具有重要的地位,因为最终用于处理请求的HttpHandler对象由它提供,所有的RouteHandler类型均实现了具有如下定义的IRouteHandler接口,HttpHandler的提供实现在它的GetHttpHandler方法中。我们可以在构造函数中对RouteDataRouteHandler属性进行初始化,也可以直接对这个可读/写的属性进行赋值。

public interface IRouteHandler
{
IHttpHandler GetHttpHandler(RequestContext requestContext);
}
当请求被成功路由到某个.aspx页面后,通过调用匹配Route对象的GetRouteData方法生成的RouteData被直接附加到目标页面对应的page对象上。Page具有一个类型为RouteData的同名只读属性,它返回的正是这个RouteData对象。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。