先來個圖預覽一下:
1.首先是System.Web.Routing下的RequestContext類,代碼相當簡單,把HttpContextBase和RouteData放在一起就OK了。
Code
using System;
using System.Security.Permissions;
using System.Web;
namespace System.Web.Routing
{
[AspNetHostingPermission(SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal),
AspNetHostingPermission(SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]
public class RequestContext
{
// Methods
public RequestContext(HttpContextBase httpContext, RouteData routeData)
{
if (httpContext == null)
throw new ArgumentNullException("httpContext");
if (routeData == null)
throw new ArgumentNullException("routeData");
this.HttpContext = httpContext;
this.RouteData = routeData;
}
// Properties
public HttpContextBase HttpContext { get; internal set; }
public RouteData RouteData { get; internal set; }
}
}
關於RouteData,我以後會講的,現在只需要知道它儲存了Route資訊,從URL中根據Route規則Map到的參數值都在裡面。
2.接著就是ControllerContext類了,這個類很有意思:
using System.Security.Permissions;
namespace System.Web.Mvc
{
using System.Web.Routing;
[AspNetHostingPermission(SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]
[AspNetHostingPermission(SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)]
public class ControllerContext : RequestContext
{
protected internal ControllerContext(ControllerContext controllerContext)
: this(GetControllerContext(controllerContext), GetControllerContext(controllerContext).Controller) {}
public ControllerContext(HttpContextBase httpContext, RouteData routeData, ControllerBase controller)
: base(httpContext, routeData)
{
if (controller == null) throw new ArgumentNullException("controller");
Controller = controller;
}
public ControllerContext(RequestContext requestContext, ControllerBase controller)
: this(
GetRequestContext(requestContext).HttpContext, GetRequestContext(requestContext).RouteData, controller) {}
public ControllerBase Controller { get; private set; }
internal static RequestContext GetRequestContext(RequestContext requestContext)
{
if (requestContext == null) throw new ArgumentNullException("requestContext");
return requestContext;
}
internal static ControllerContext GetControllerContext(ControllerContext controllerContext)
{
if (controllerContext == null) throw new ArgumentNullException("controllerContext");
return controllerContext;
}
}
}
其實它也就是在RequestContext的基礎上加了個對Controller的引用(當然是對ControllerBase基類的引用)。
它的幾個重載的建構函式以及靜態方法寫得很有意思,值得借鑒。
3.