當前位置:編程學習大全網 - 編程語言 - ASP.NET MVC 4框架揭秘:Controller(1)

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

  • 上一篇:永順電腦編程
  • 下一篇:如何學習編程和學習編程
  • copyright 2024編程學習大全網