您现在的位置是:首页 >

URL路由框架类 ASP.NET MVC 4框架揭秘:URL路由(1)

火烧 2023-04-17 03:30:10 1054
ASP.NET MVC 4框架揭秘:URL路由(1)    URL路由( )  对于一个ASP NET MVC应用来说 针对HTTP请求的处理实现在某个Co troller类型的某个Actio 方法中

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; }

URL路由框架类 ASP.NET MVC 4框架揭秘:URL路由(1)

  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  
永远跟党走
  • 如果你觉得本站很棒,可以通过扫码支付打赏哦!

    • 微信收款码
    • 支付宝收款码