ASP.NET MVC是如何啟動並執行(4): Action的執行

來源:互聯網
上載者:User

作為Controller基類ControllerBase的Execute方法的核心在於對Action方法的執行和作為方法返回的ActionResult的執行,兩者的執行是通過一個叫做ActionInvoker的組件來完成的。

一、ActionInvoker

我們同樣為ActionInvoker定義了一個介面IActionInvoker。如下面的代碼片斷所示,該介面定義了一個唯一的方法InvokeAction用於執行指定名稱的Action方法,該方法的第一個參數是一個表示基於當前Controller內容相關的ControllerContext對象。

   1: public interface IActionInvoker
2: {
3: void InvokeAction(ControllerContext controllerContext, string actionName);
4: }

ControllerContext類型在真正的ASP.NET MVC架構中要負責一些,在這裡我們對它進行了簡化,僅僅將它表示成對當前Controller和請求內容相關的封裝,而這兩個要素分別通過如下所示的Controller和RequestContext屬性工作表示。

   1: public class ControllerContext
2: {
3: public ControllerBase Controller { get; set; }
4: public RequestContext RequestContext { get; set; }
5: }

ControllerBase中表示ActionInvoker的同名屬性在建構函式中被初始化。在Execute方法中,通過作為方法參數的RequestContext對象建立ControllerContext對象,並通過包含在RequestContext中的RouteData得到目標Action的名稱,然後將這兩者作為參數調用ActionInvoker的InvokeAction方法。

從前面給出的關於ControllerBase的定義我們可以看到在建構函式中預設建立的ActionInvoker是一個類型為ControllerActionInvoker的對象。如下所示的代碼片斷反映了整個ControllerActionInvoker的定義,而InvokeAction方法的目的在於實現針對Action方法的執行。由於Action方法具有相應的參數,在執行Action方法之前必須進行參數的綁定。ASP.NET MVC將這個機製成為Model的綁定,而這又涉及到另一個重要的組件ModelBinder。

   1: public class ControllerActionInvoker : IActionInvoker
2: {
3: public IModelBinder ModelBinder { get; private set; }
4: public ControllerActionInvoker()
5: {
6: this.ModelBinder = new DefaultModelBinder();
7: }
8: public void InvokeAction(ControllerContext controllerContext, string actionName)
9: {
10: MethodInfo method = controllerContext.Controller.GetType().GetMethods().First(m => string.Compare(actionName, m.Name, true) == 0);
11: List<object> parameters = new List<object>();
12: foreach (ParameterInfo parameter in method.GetParameters())
13: {
14: parameters.Add(this.ModelBinder.BindModel(controllerContext, parameter.Name, parameter.ParameterType));
15: }
16: ActionResult actionResult = method.Invoke(controllerContext.Controller, parameters.ToArray()) as ActionResult;
17: actionResult.ExecuteResult(controllerContext);
18: }
19: }

二、ModelBinder

我們為ModelBinder提供了一個如下一個簡單的定義,這與在真正的ASP.NET MVC中的同名介面的定義不盡相同。該介面具有唯一的BindModel根據ControllerContext和Model名稱(在這裡實際上是參數名稱)和類型得到一個作為參數的對象。

   1: public interface IModelBinder
2: {
3: object BindModel(ControllerContext controllerContext, string modelName, Type modelType);
4: }

通過前面給出的關於ControllerActionInvoker的定義我們可以看到在建構函式中預設建立的ModelBinder對象是一個DefaultModelBinder對象。由於僅僅是對ASP.NET MVC的類比,定義在自訂的DefaultModelBinder中的Model綁定邏輯比ASP.NET MVC中同名類型中實現的要簡單得多。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.