URL路由框架类 ASP.NET MVC 4框架揭秘:URL路由(1)
ASP.NET MVC 4框架揭秘:URL路由(1)
URL路由( )
对于一个ASP NET MVC应用来说 针对HTTP请求的处理实现在某个Controller类型的某个Action方法中 每个HTTP请求不再像ASP NET Web Forms应用一样是对应着一个物理文件 而是对应着某个Controller的某个Action 目标Controller和Action的名称包含在HTTP请求的URL中 而ASP NET MVC的首要任务就是通过当前HTTP请求的解析得到正确的Controller和Action的名称 这个过程是通过ASP NET MVC的URL路由机制来实现的
RouteData
ASP NET定义了一个全局的路由表 路由表中的每个路由对象包含一个URL模板 目标Controller和Action的名称可以通过路由变量以占位符(比如 {controller} 和 {action} )定义在URL模板中 也可以作为路由对象的默认值 对于每一个抵达的HTTP请求 ASP NET MVC会遍历路由表找到一个具有与当前请求URL模式相匹配的路由对象 并最终解析出以Controller和Action名称为核心的路由数据 在我们自定义的ASP NET MVC框架中 路由数据通过具有如下定义的RouteData类型表示
public class RouteData
{
public IDictionary<string object> Values { get; private set; }

public IDictionary<string object> DataTokens { get; private set; }
public IRouteHandler RouteHandler { get; set; }
public RouteBase Route { get; set; }
public RouteData()
{
this Values = new Dictionary<string object>()
this DataTokens = new Dictionary<string object>()
this DataTokens Add( namespaces new List<string>())
}
public string Controller
{
get
{
object controllerName = string Empty;
this Values TryGetValue( controller out controllerName)
return controllerName ToString()
}
}
public string ActionName
{
get
{
object actionName = string Empty;
this Values TryGetValue( action out actionName)
return actionName ToString()
}
}
}
如上面的代码片段所示 RouteData定义了两个字典类型的属性Values和DataTokens 前者代表直接从请求地址解析出来的变量列表 后者代表具有其他来源的变量列表 表示Controller和Action名称的同名属性直接从Values字典中提取 对应的Key分别为controller和action
我们之前已经提到过ASP NET MVC本质上是由两个自定义的ASP NET组件来实现的 一个是自定义的HttpModule 另一个是自定义的HttpHandler 而后者从RouteData的RouteHandler属性获得 RouteData的RouteHandler属性类型为IRouteHandler接口 如下面的代码片段所示 该接口具有一个唯一的GetHttpHandler用于返回真正用于处理HTTP请求的HttpHandler对象
public interface IRouteHandler
{
IHttpHandler GetHttpHandler(RequestContext requestContext)
}
IRouteHandler接口的GetHttpHandler方法接受一个类型为RequestContext的参数 顾名思义 RequestContext表示当前(HTTP)请求的上下文 其核心就是对当前HttpContext和RouteData的封装 这可以通过如下的代码片段看出来
public class RequestContext
{
public virtual HttpContextBase HttpContext { get; set; }
public virtual RouteData RouteData { get; set; }
}
Route和RouteTable
RouteData具有一个类型为RouteBase的Route属性 表示生成路由数据对应的路由对象 如下面的代码片段所示 RouteBase是一个抽象类 它仅仅包含一个GetRouteData方法 该方法判断是否与当前请求相匹配 并在匹配的情况下返回用于封装路由数据的RouteData对象 该方法接受一个表示当前HTTP上下文的HttpContextBase对象 如果与当前请求不匹配 则返回Null
public abstract class RouteBase
{
public abstract RouteData GetRouteData(HttpContextBase Context)
}
返回目录ASP NET MVC 框架揭秘
编辑推荐
ASP NET开发培训视频教程
Microsoft NET框架程序设计视频教程
Java程序性能优化 让你的Java程序更快 更稳定
lishixinzhi/Article/program/net/201311/16112