Controller()
我们知道作为Controller的类型直接或者间接实现了SystemWebMvcIController接口如下面的代码片段所示IController接口仅仅包含一个参数类型为RequestContext的Execute方法当一个Controller对象被激活之后其核心的操作就是从包含在当前请求上下文的路由数据中获取Action名称并据此解析出对应的方法将通过Model绑定机制从当前请求上下文中提取相应的数据并调用Action方法生成对应的参数列表所有这些后续操作都是间接地通过调用Controller的Execute方法来完成的
public interface IController
{
void Execute(RequestContext requestContext)
}
定义在IController接口中的Execute是以同步的方式执行的为了支持以异步方式对请求的处理IController接口的异步版本SystemWebMvcIAsyncController被定义出来如下面的代码片段所示实现了IAsyncController接口Controller的执行通过BeginExecute/EndExecute方法以异步的形式完成
public interface IAsyncController : IController
{
IAsyncResult BeginExecute(RequestContext requestContext
AsyncCallback callback object state)
void EndExecute(IAsyncResult asyncResult)
}
抽象类SystemWebMvcControllerBase实现了IController接口如下面的代码片段所示ControllerBase以显式接口实现的方式定义了Execute方法该方法在内部直接调用受保护的Execute虚方法而后者最终会调用抽象方法ExecuteCore方法
public abstract class ControllerBase : IController
{
//其他成员
protected virtual void Execute(RequestContext requestContext)
protected abstract void ExecuteCore()
void IControllerExecute(RequestContext requestContext)
public ControllerContext ControllerContext { get; set; }
public TempDataDictionary TempData { get; set; }
public object ViewBag { [return: Dynamic] get; }
public ViewDataDictionary ViewData { get; set; }
}
ControllerBase具有如下几个重要的属性TempDataViewBag和ViewData它们用于存储从Controller向View传递的数据或者变量其中TempData和ViewData具有基于字典的数据结构Key和Value分别表示变量的名称和值两者的不同之处在于前者仅仅用于存储临时数据并且设置的变量被第一次读取之后会被移除换句话说通过TempData设置的变量只能被读取一次ViewBag和ViewData共享着相同的数据它们之间的不同之处在于前者是一个动态对象我们可以为其指定任意属性(动态属性名将作为数据字典的Key)
在ASPNET MVC中我们会陆续遇到一系列的上下文(Context)对象之前已经对表示请求上下文的RequestContext(HttpContext + RouteData)进行了详细的介绍现在来介绍另一个具有如下定义的上下文类型SystemWebMvcControllerContext
public class ControllerContext
{
//其他成员
public ControllerContext()
public ControllerContext(RequestContext requestContext
ControllerBase controller)
public ControllerContext(HttpContextBase httpContext
RouteData routeData ControllerBase controller)
public virtual ControllerBase Controller { get; set; }
public RequestContext RequestContext { get; set; }
public virtual HttpContextBase HttpContext { get; set; }
public virtual RouteData RouteData { get; set; }
}
顾名思义ControllerContext就是基于某个Controller对象的上下文从如上的代码可以看出一个ControllerContext对象实际上是对一个Controller对象和RequestContext的封装这两个对象分别对应着ControllerContext中的同名属性可以在构建ControllerContext的时候为调用的构造函数指定相应的参数来初始化它们
通过HttpContext和RouteData属性返回的HttpContextBase和RouteData对象在默认情况下实际上就是RequestContext的核心组成部分当ControllerBase的Execute方法被执行的时候它会根据传入的ReuqestContext创建ControllerContext对象后续的操作可以看成是在该上下文中进行
返回目录ASPNET MVC 框架揭秘
编辑推荐
ASP NET开发培训视频教程
Microsoft NET框架程序设计视频教程
Java程序性能优化让你的Java程序更快更稳定
Visual C++音频/视频技术开发与实战