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