您现在的位置是:首页 >

java 路由框架 ASP.NET MVC 4框架揭秘:URL路由(2)

火烧 2023-02-17 05:48:07 1032
ASP.NET MVC 4框架揭秘:URL路由(2)    URL路由( )  ASP NET MVC提供的基于URL模板的路由机制是通过其子类Route实现的 如下面的代码片段所示 它具有一个代表U

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

     URL路由( )

  ASP NET MVC提供的基于URL模板的路由机制是通过其子类Route实现的 如下面的代码片段所示 它具有一个代表URL模板的字符串类型的Url属性 在实现的GetRouteData方法中 我们通过HttpContextBase获取当前请求的URL 如果它与URL模板的模式相匹配则创建一个RouteData返回 否则返回Null 对于返回的RouteData对象 其Values属性表示的字典对象包含直接通过地址解析出来的变量 而对于DataTokens字典和RouteHandler属性 则直接取自Route对象的同名属性

  public class Route : RouteBase

  {

  public IRouteHandler                        RouteHandler { get; set; }

  public string                           Url { get; set; }

  public IDictionary<string object>          DataTokens { get; set; }

  public Route()

  {

  this DataTokens           = new Dictionary<string object>()

  this RouteHandler         = new MvcRouteHandler()

  }

  public override RouteData GetRouteData(HttpContextBase Context)

  {

  IDictionary<string object> variables;

  if (this Match(Context Request

   AppRelativeCurrentExecutionFilePath Substring( ) out variables))

  {

  RouteData routeData = new RouteData()

  foreach (var item in variables)

  {

  routeData Values Add(item Key item Value)

  }

  foreach (var item in DataTokens)

  {

  routeData DataTokens Add(item Key item Value)

  }

  routeData RouteHandler = this RouteHandler;

  return routeData;

  }

  return null;

  }

  protected bool Match(string requestUrl

  out IDictionary<string object> variables)

  {

  variables                = new Dictionary<string object>()

  string[] strArray    = requestUrl Split( / )

  string[] strArray    = this Url Split( / )

  if (strArray Length != strArray Length)

  {

  return false;

  }

  for (int i = ; i < strArray Length; i++)

  {

  if(strArray [i] StartsWith( { ) && strArray [i] EndsWith( } ))

  {

  variables Add(strArray [i] Trim( {} ToCharArray()) strArray [i])

  }

  }

  return true;

  }

  }

  由于同一个Web应用可以采用多种不同的URL模式 所以需要注册多个继承自RouteBase的路由对象 多个路由对象组成了一个路由表 在我们自定义ASP NET MVC框架中 路由表通过类型RouteTable表示 如下面的代码片段所示 RouteTable仅仅具有一个类型为RouteDictionary的Routes属性表示针对整个Web应用的全局路由表

  public class RouteTable

  {

  public static RouteDictionary Routes { get; private set; }

  static RouteTable()

  {

  Routes = new RouteDictionary()

  }

  }

  RouteDictionary表示一个具名的路由对象的列表 我们直接让它继承自泛型的字典类型Dictionary<string RouteBase> 其中的Key表示路由对象的注册名称 在GetRouteData方法中 我们遍历集合找到与指定的HttpContextBase对象匹配的路由对象 并得到对应的RouteData

  public class RouteDictionary: Dictionary<string RouteBase>

  {

  public RouteData GetRouteData(HttpContextBase Context)

java 路由框架 ASP.NET MVC 4框架揭秘:URL路由(2)

  {

  foreach (var route in this Values)

  {

  RouteData routerouteData = route GetRouteData(Context)

  if (null != routeData)

  {

  return routeData;

  }

  }

  return null;

  }

  }

      返回目录ASP NET MVC 框架揭秘

      编辑推荐

      ASP NET开发培训视频教程

      Microsoft NET框架程序设计视频教程

       Java程序性能优化 让你的Java程序更快 更稳定

lishixinzhi/Article/program/net/201311/16111  
永远跟党走
  • 如果你觉得本站很棒,可以通过扫码支付打赏哦!

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