程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> ASP.NET >> 關於ASP.NET >> ASP.NET MVC是如何運行的(4): Action的執行

ASP.NET MVC是如何運行的(4): Action的執行

編輯:關於ASP.NET

作為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中同名類型中實現的要簡單得多。

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