URL路由()
对于一个ASPNET MVC应用来说针对HTTP请求的处理实现在某个Controller类型的某个Action方法中每个HTTP请求不再像ASP NET Web Forms应用一样是对应着一个物理文件而是对应着某个Controller的某个Action目标Controller和Action的名称包含在HTTP请求的URL中而ASPNET MVC的首要任务就是通过当前HTTP请求的解析得到正确的Controller和Action的名称这个过程是通过ASPNET MVC的URL路由机制来实现的
RouteData
ASPNET定义了一个全局的路由表路由表中的每个路由对象包含一个URL模板目标Controller和Action的名称可以通过路由变量以占位符(比如{controller}和{action})定义在URL模板中也可以作为路由对象的默认值对于每一个抵达的HTTP请求ASPNET MVC会遍历路由表找到一个具有与当前请求URL模式相匹配的路由对象并最终解析出以Controller和Action名称为核心的路由数据在我们自定义的ASPNET 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()
{
thisValues = new Dictionary<string object>()
thisDataTokens = new Dictionary<string object>()
thisDataTokensAdd(namespaces new List<string>())
}
public string Controller
{
get
{
object controllerName = stringEmpty;
thisValuesTryGetValue(controller out controllerName)
return controllerNameToString()
}
}
public string ActionName
{
get
{
object actionName = stringEmpty;
thisValuesTryGetValue(action out actionName)
return actionNameToString()
}
}
}
如上面的代码片段所示RouteData定义了两个字典类型的属性Values和DataTokens前者代表直接从请求地址解析出来的变量列表后者代表具有其他来源的变量列表表示Controller和Action名称的同名属性直接从Values字典中提取对应的Key分别为controller和action
我们之前已经提到过ASPNET MVC本质上是由两个自定义的ASPNET组件来实现的一个是自定义的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 httpContext)
}
返回目录ASPNET MVC 框架揭秘
编辑推荐
ASP NET开发培训视频教程
Microsoft NET框架程序设计视频教程
Java程序性能优化让你的Java程序更快更稳定
Visual C++音频/视频技术开发与实战