上個篇幅中說到ControllerDescriptor類型的由來過程,對于ControllerDescriptor類型來言ActionDescriptor類型的生成則簡單的多了,本章的主題有兩個,第一是說明ActionDescriptor類型的生成過程,第二是描述ActionDescriptor類型的重要性,在哪里體現它的重要性呢?對于前面篇幅的學習忽略了最后控制器方法的執(zhí)行過程,而在這個執(zhí)行過程中ActionDescriptor類型起到了至關重要的作用,來看下文吧。
在ReflectedControllerDescriptor類型生成后,流程會回到MVC框架中,并且由之調用ControllerActionInvoker類型下的FindAction()方法,在FindAction()【是ControllerActionInvoker類型中的方法】的參數中,第一個參數類型是控制器上下文類型,第二個則是我們在上篇中講解生成的ReflectedControllerDescriptor類型【ControllerDescriptor類型】,第三個則是控制器方法的名稱,第一個參數的暫且不管,在FindAction()方法中是會使用第二個ReflectedControllerDescriptor類型的參數中的FindAction()方法【圖中所示的FindAction()方法】,并且參數是引用上層的FindAction()方法傳遞下來的,然后通過ReflectedControllerDescriptor類型中的ActionMethodSelector類型變量生成一個MethodInfo類型的變量,用于實例化ReflectedActionDescriptor類型。

public class ReflectedActionDescriptor : ActionDescriptor
{
public ReflectedActionDescriptor(MethodInfo methodInfo, string actionName, ControllerDescriptor controllerDescriptor);
public override string ActionName { get; }
public override ControllerDescriptor ControllerDescriptor { get; }
//
// 摘要:
// 獲取或設置操作-方法信息。
//
// 返回結果:
// 操作-方法信息。
public MethodInfo MethodInfo { get; }
public override string UniqueId { get; }
// 摘要:
// 使用指定的操作-方法參數來執(zhí)行指定的控制器上下文。
//
// 參數:
// controllerContext:
// 控制器上下文。
//
// parameters:
// 參數。
//
// 返回結果:
// 操作返回值。
//
// 異常:
// System.ArgumentNullException:
// parameters 或 controllerContext 參數為 null。
public override object Execute(ControllerContext controllerContext, IDictionary<string, object> parameters);
public override object[] GetCustomAttributes(bool inherit);
public override object[] GetCustomAttributes(Type attributeType, bool inherit);
public override ParameterDescriptor[] GetParameters();
public override ICollection<ActionSelector> GetSelectors();
public override bool IsDefined(Type attributeType, bool inherit);
}

在代碼1-1中,我保留了兩個注釋一個是MethodInfo屬性的,還有一個就是Execute()方法的,因為這一個屬性一個方法在下面重要性小節(jié)中會有敘述到。
想必看過前面篇幅的朋友都知道,在ASP.NET MVC 過濾器(三)篇幅中我們講解到了行為過濾器的在MVC框架中的具體生成執(zhí)行過程,然后在那個篇幅中因為主題不符的原因,我們忽略了Action的執(zhí)行,看下示意圖2
對于這幅示意圖有什么不明白的朋友可以去看博主所寫的ASP.NET MVC 過濾器(三)篇幅,而對于本篇而言為了說明ActionDescriptor類型的重要性就需要講到Action的執(zhí)行過程,上面的圖我們只需要關注圖3的部分。
對于Action執(zhí)行過程的入口是在ControllerActionInvoker類型的InvokeActionMethod()方法之中,看到圖3中的方法參數就明白了ActionDescriptor類型的重要性了。它是必須的,來看下圖4.