RouteData

RouteData 는 Routing 구성 요소 에 속 하지만 mvc 의 전체 절 차 를 관통 한다.중요 하지 않다 고 할 수 없다.
우선 RouteData 가 언제 어떻게 사용 되 는 지 살 펴 보 자.
   public virtual void PostResolveRequestCache(HttpContextBase context)
   {
       RouteData routeData = this.RouteCollection.GetRouteData(context);
       if (routeData != null)
       {
           IRouteHandler routeHandler = routeData.RouteHandler;
           if (routeHandler == null)
           {
               throw new InvalidOperationException(string.Format(CultureInfo.CurrentUICulture, RoutingResources.UrlRoutingModule_NoRouteHandler, new object[0]));
           }
           if (!(routeHandler is StopRoutingHandler))
           {
               RequestContext requestContext = new RequestContext(context, routeData);
               IHttpHandler httpHandler = routeHandler.GetHttpHandler(requestContext);
               if (httpHandler == null)
               {
                   throw new InvalidOperationException(string.Format(CultureInfo.CurrentUICulture, RoutingResources.UrlRoutingModule_NoHttpHandler, new object[] { routeHandler.GetType() }));
               }
               context.Items[_requestDataKey] = new RequestData { OriginalPath = context.Request.Path, HttpHandler = httpHandler };
               context.RewritePath("~/UrlRouting.axd");
           }
       }
   }

여기에서 볼 수 있 듯 이 RouteData 는 RouteCollection.GetRouteData 방법 으로 HttpContextBase 상하 문 에서 해석 된다.
RouteData 에 RouteHandler 를 설치 하 는 것 외 에 Route 규칙 에 따라 url 을 분석 한 후에 얻 은 key-vaule 쌍:예 를 들 어 controller,action 등
그리고 HttpContextBase 와 함께 RequestContext 에 봉인 합 니 다.IHttpHandler 에 게 맡 깁 니 다.
http Handler 와 Request.Path 를 RequestData 에 봉 하여 HttpContextBase 에 넣 습 니 다.그 구성 은 다음 과 같다.
다음은 RouteCollection 에서 RouteData 를 얻 는 방법 이다.Collection 의 모든 Route 를 옮 겨 다 니 며 첫 번 째 규칙 에 맞 는 RouteData 를 되 돌려 줍 니 다.
   1: public RouteData GetRouteData(HttpContextBase httpContext)
   2: {
   3:     if (httpContext == null)
   4:     {
   5:         throw new ArgumentNullException("httpContext");
   6:     }
   7:     if (httpContext.Request == null)
   8:     {
   9:         throw new ArgumentException(RoutingResources.RouteTable_ContextMissingRequest, "httpContext");
  10:     }
  11:     if (!this.RouteExistingFiles)
  12:     {
  13:         string appRelativeCurrentExecutionFilePath = httpContext.Request.AppRelativeCurrentExecutionFilePath;
  14:         if (((appRelativeCurrentExecutionFilePath != "~/") && (this._vpp != null)) && (this._vpp.FileExists(appRelativeCurrentExecutionFilePath) || this._vpp.DirectoryExists(appRelativeCurrentExecutionFilePath)))
  15:         {
  16:             return null;
  17:         }
  18:     }
  19:     using (this.GetReadLock())//   
  20:     {
  21:         foreach (RouteBase base2 in this)//          RouteBase
  22:         {
  23:             RouteData routeData = base2.GetRouteData(httpContext); //  RouteBase RouteData.     Class Route.
  24:             if (routeData != null)
  25:             {
  26:                 return routeData;
  27:             }
  28:         }
  29:     }
  30:     return null;
  31: }

Route(RouteBase 에 계승)의 GetRouteData 구현 입 니 다.084          public   override   RouteData GetRouteData (HttpContextBase httpContext) 085          { 086              var path = httpContext.Request.AppRelativeCurrentExecutionFilePath; 087              var pathInfo = httpContext.Request.PathInfo; 088
  089              if   (!String.IsNullOrEmpty (pathInfo)) 090                  throw   new   NotImplementedException (); 091
  092              // probably code like this causes ArgumentOutOfRangeException under .NET. 093              // It somehow allows such path that is completely equivalent to the Url. Dunno why. 094              if   (Url != path && path.Substring (0, 2) !=  "~/" ) 095                  return   null ; 096              path = path.Substring (2); 097
  098              var values = url.Match (path, Defaults); 099              if   (values ==  null ) 100                  return   null ; 101
  102              RouteValueDictionary constraints = Constraints; 103              if   (constraints !=  null ) 104                  foreach   (var p  in   constraints) 105                      if   (!ProcessConstraint (httpContext, p.Value, p.Key, values, RouteDirection.IncomingRequest)) 106                          return   null ; 107                108              var rd =  new   RouteData ( this , RouteHandler); 109              RouteValueDictionary rdValues = rd.Values; 110                111              foreach   (var p  in   values) 112                  rdValues.Add (p.Key, p.Value); 113
  114              RouteValueDictionary dataTokens = DataTokens; 115              if   (dataTokens !=  null ) { 116                  RouteValueDictionary rdDataTokens = rd.DataTokens; 117                  foreach   (var token  in   dataTokens) 118                      rdDataTokens.Add (token.Key, token.Value); 119              } 120                121              return   rd; 122          } 123
 
더 구체 적 인 코드 에 대해 서 는 참조 할 수 있 습 니 다.
http://www.cnblogs.com/Wind-Eagle/archive/2008/12/05/1348374.html

좋은 웹페이지 즐겨찾기