ASP.NET MVC 4框架揭秘:Controller(1)

 我来答
世纪网络17
2022-10-16 · TA获得超过5951个赞
知道小有建树答主
回答量:2426
采纳率:100%
帮助的人:143万
展开全部

     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

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式