Wind-Eagle

No pain,no gain!
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

ASP.NET MVC中的各种上下文对象

Posted on 2008-12-05 12:11  Andrew Yin  阅读(3185)  评论(1编辑  收藏  举报

先来个图预览一下:

1.首先是System.Web.Routing下的RequestContext类,代码相当简单,把HttpContextBase和RouteData放在一起就OK了。

Code

关于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 == nullthrow new ArgumentNullException("controller");
            Controller 
= controller;
        }


        
public ControllerContext(RequestContext requestContext, ControllerBase controller)
            : 
this(
                GetRequestContext(requestContext).HttpContext, GetRequestContext(requestContext).RouteData, controller) 
{}

        
public ControllerBase Controller getprivate set; }

        
internal static RequestContext GetRequestContext(RequestContext requestContext)
        
{
            
if (requestContext == nullthrow new ArgumentNullException("requestContext");
            
return requestContext;
        }


        
internal static ControllerContext GetControllerContext(ControllerContext controllerContext)
        
{
            
if (controllerContext == nullthrow new ArgumentNullException("controllerContext");
            
return controllerContext;
        }

    }

}

其实它也就是在RequestContext的基础上加了个对Controller的引用(当然是对ControllerBase基类的引用)。

它的几个重载的构造函数以及静态方法写得很有意思,值得借鉴。

3.