熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

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

2013-11-13 12:32:30  來源: .NET編程 

    URL路由(

  ASPNET 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()

  {

  thisDataTokens           = new Dictionary<string object>()

  thisRouteHandler         = new MvcRouteHandler()

  }

  public override RouteData GetRouteData(HttpContextBase httpContext)

  {

  IDictionary<string object> variables;

  if (thisMatch(httpContextRequest

  AppRelativeCurrentExecutionFilePathSubstring( out variables))

  {

  RouteData routeData = new RouteData()

  foreach (var item in variables)

  {

  routeDataValuesAdd(itemKey itemValue)

  }

  foreach (var item in DataTokens)

  {

  routeDataDataTokensAdd(itemKey itemValue)

  }

  routeDataRouteHandler = thisRouteHandler;

  return routeData;

  }

  return null;

  }

  protected bool Match(string requestUrl

  out IDictionary<stringobject> variables)

  {

  variables                = new Dictionary<stringobject>()

  string[] strArray   = requestUrlSplit(/

  string[] strArray   = thisUrlSplit(/

  if (strArrayLength != strArrayLength)

  {

  return false;

  }

  for (int i = ; i < strArrayLength; i++)

  {

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

  {

  variablesAdd(strArray[i]Trim({}ToCharArray())strArray[i])

  }

  }

  return true;

  }

  }

  由於同一個Web應用可以采用多種不同的URL模式所以需要注冊多個繼承自RouteBase的路由對象多個路由對象組成了一個路由表在我們自定義ASPNET 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 httpContext)

  {

  foreach (var route in thisValues)

  {

  RouteData routerouteData = routeGetRouteData(httpContext)

  if (null != routeData)

  {

  return routeData;

  }

  }

  return null;

  }

  }

       返回目錄ASPNET MVC 框架揭秘

       編輯推薦

       ASP NET開發培訓視頻教程

       Microsoft NET框架程序設計視頻教程

       Java程序性能優化讓你的Java程序更快更穩定

       Visual C++音頻/視頻技術開發與實戰


From:http://tw.wingwit.com/Article/program/net/201311/16111.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.