熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

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

2022-06-13   來源: .NET編程 

    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++音頻/視頻技術開發與實戰


From:http://tw.wingwit.com/Article/program/net/201311/16100.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.