先来个图预览一下:

1.首先是System.Web.Routing下的RequestContext类,代码相当简单,把HttpContextBase和RouteData放在一起就OK了。
关于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.


浙公网安备 33010602011771号