程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> ASP.NET >> 關於ASP.NET >> asp.net mvc中“Action”的創建

asp.net mvc中“Action”的創建

編輯:關於ASP.NET

內容概覽

本篇主要探討“Action”的創建過程,為什麼要加引號呢?因為我們創建的不 是真正的Action,方法是沒法創建的,它是指 ActionDescriptor對象,是對 Action方法描述的一個對象,在mvc中,方法的調用是利用反射來實現的。下面我 們就具體討論一下這個過程。

* 為什麼要創建Action?

* ControllerDescriptor與ActionDescriptor

* ActionMethodSelector是什麼?

* 獲取全部合法的Action

為什麼要創建Action?Top

在一個請求到達時,必然最終會由一個Action去執行,那麼這個Action是怎麼 執行的呢?答案是利用反射得到 Action的描述,然後再調用Action的。為什麼要 這麼大費周折呢?因為在Action上還有好多Filter,我們要在執行的時候考慮到 AOP的影響,並把二者無縫的結合起來。所以在執行Action上,我們要得到一個 ActionDescriptor對象,這個對象用以描述Action方法的一些特性。

ControllerDescriptor與ActionDescriptor

ControllerDescriptor是描述Controller的類,ActionDescriptor是描述 Action的類,而Action是 Controller的方法,那麼在ControllerDescriptor和 ActionControllerDescriptor兩者之間就必然存在著某種關聯,下面我們看看到 底他們是一種什麼關系:

在ControllerActionInvoker類中,我們發現了兩個類直接的一次協作,代碼 是這樣的:

ControllerDescriptor controllerDescriptor =  GetControllerDescriptor(controllerContext);
ActionDescriptor actionDescriptor = FindAction(controllerContext,  controllerDescriptor, actionName);
ActionDescriptor actionDescriptor =  controllerDescriptor.FindAction(controllerContext,  actionName);

我們看到,ActionDescriptor是調用ControllerDescriptor的FindAction方法 得到的。我們猜想它們可能是一對多關系,一個ControllerDescriptor對應多個 ActionDescriptor,下面就一步一步來驗證我們的猜想,首先我們先從 ReflectedControllerDescriptor類入手,因為這個類是ControllerDescriptor類 的惟一繼承者。

ReflectedControllerDescriptor類有幾個比較重要的字段:

private ActionDescriptor[] _canonicalActionsCache;
private readonly Type _controllerType;
private readonly ActionMethodSelector _selector;

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved