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

ASP.NET MVC 4框架揭秘:Action的執行(1)[1]

2013-11-13 12:32:12  來源: .NET編程 

    Action的執行(

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

  ActionInvoker

  同樣為ActionInvoker定義了一個接口IactionInvoker如下面的代碼片段所示該接口定義了一個唯一的方法InvokeAction用於執行指定名稱的Action方法該方法的第一個參數是一個表示基於當前Controller上下文的ControllerContext對象

  public interface IActionInvoker

  {

  void InvokeAction(ControllerContext controllerContext string actionName)

  }

  ControllerContext類型在真正的ASPNET MVC框架中要復雜一些在這裡我們對它進行了簡化僅僅將它表示成對當前Controller和請求上下文的封裝而這兩個要素分別通過如下所示的Controller和RequestContext屬性表示

  public class ControllerContext

  {

  public ControllerBase Controller { get; set; }

  public RequestContext RequestContext { get; set; }

  }

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

  從前面給出的關於ControllerBase的定義中可以看到在構造函數中默認創建的ActionInvoker是一個類型為ControllerActionInvoker的對象如下所示的代碼片段反映了整個ControllerActionInvoker的定義InvokeAction方法的目的在於實現針對Action方法的執行由於Action方法具有相應的參數在執行Action方法之前必須進行參數的綁定ASPNET MVC將這個機制稱為Model的綁定而這又涉及另一個重要的組件ModelBinder

  public class ControllerActionInvoker : IActionInvoker

  {

  public IModelBinder ModelBinder { get; private set; }

  public ControllerActionInvoker()

  {

  thisModelBinder = new DefaultModelBinder()

  }

  public void InvokeAction(ControllerContext controllerContext

  stringactionName)

  {

  MethodInfo method = controllerContextControllerGetType()GetMethods()

  First(m =>stringCompare(actionName mName true) ==

  List<object> parameters = new List<object>()

  foreach (ParameterInfo parameter in methodGetParameters())

  {

  parametersAdd(thisModelBinderBindModel(controllerContext

  parameterName parameterParameterType))

  }

  ActionResult actionResult = methodInvoke(controllerContextController

  parametersToArray()) as ActionResult;

  actionResultExecuteResult(controllerContext)

  }

  }

  ModelBinder

  我們為ModelBinder提供了一個簡單的定義這與在真正的ASPNET MVC中的同名接口的定義不盡相同如下面的代碼片段所示該接口具有唯一的BindModel方法根據ControllerContext和Model名稱(在這裡實際上是參數名稱)和類型得到一個作為參數的對象

  public interface IModelBinder

  {

  object BindModel(ControllerContext controllerContext string modelName

  Type modelType)

  }

  通過前面給出的關於ControllerActionInvoker的定義可以看到在構造函數中默認創建的ModelBinder對象是一個DefaultModelBinder對象由於僅僅是對ASPNET MVC的模擬定義在自定義的DefaultModelBinder中的Model綁定邏輯比ASPNET MVC的DefaultModelBinder要簡單得多很多復雜的Model機制並未在我們自定義的DefaultModelBinder體現出來

[]  []  


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