RouteData
우선 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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
클린 아키텍처의 Presenter를 이해하기 어려운 것은 MVC 2가 아니기 때문에클린 아키텍처에는 구체적인 클래스 구성 예를 보여주는 다음 그림이 있습니다. 이 그림 중에서 Presenter와 Output Boundary(Presenter의 인터페이스)만 구체 구현을 이미지하는 것이 매우 어렵다...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.