10

Attribute Routingを使用するコントローラーのアクションのActionDescriptorを取得しようとしていますが、常に null です。

var controllerDescriptor = new ReflectedControllerDescriptor(controllerType);
var actionDescriptor = 
    controllerDescriptor.FindAction(controllerContext, actionName) ??
    controllerDescriptor.GetCanonicalActions().FirstOrDefault(a => a.ActionName == actionName);

私の調査から、クラスActionMethodSelectorBaseには、指定したコントローラー内のすべてのメソッドを分割するPopulateLookupTablesというメソッドがあることがわかりました。メソッド内では、MethodInfo のリストを 2 セットのリストにフィルタリングします。

  • AliasedMethods - ActionNameSelectorAttribute で装飾された直接ルートのないすべてのアクション メソッド。
  • NonAliasedMethods - ActionNameSelectorAttribute で装飾されていない直接ルートのないすべてのアクション メソッド。

注: コントローラー レベルで直接ルート (RouteAttribute) が設定されている場合、AliasedMethods と NonAliasedMethods は空になります。

注: 直接ルートは、コントローラー (コンストラクターとイベントを除く) 内にあるメソッドとして定義され、IRouteInfoProvider または IDirectRouteFactory のいずれかから継承する属性で装飾されます (RouteAttribute はこれらの両方から継承します)。

  • DirectRouteMethods - 何らかの形式の IRouteInfoProvider を直接装飾するメソッド。
  • StandardRouteMethods - IRouteInfoProvider が直接装飾されていないメソッド。(RouteAttribute を持つコントローラのアクション メソッドを含みますが、メソッドには RouteAttribute はありません)。

ReflectedControllerDescriptor.FindActionが呼び出されると、内部的にActionMethodSelectorBase.FindActionMethodsが呼び出され、AliasedMethodsNonAliasedMethods (直接ルートを持つすべてのアクションが除外されます) のみが参照されます。

ReflectedControllerDescriptor.GetCanonicalActionsが呼び出されると、内部的にReflectedControllerDescriptor.GetAllActionMethodsFromSelector呼び出されます。これはAliasedMethodsNonAliasedMethods (直接ルートを持つすべてのアクションを除外します) のみを調べます。

私が見る限り、DirectRouteMethodsはRouteCollection.MapMvcAttributeRoutes 拡張メソッドの 1 か所でのみ使用されます。これは、RouteTable.RoutesコレクションにアクションへのRouteCollectionRouteがあることを意味しますが、そこに到達する方法がわかりません。

RouteAttributeを持つアクションのActionDescriptorを取得する方法を知っている人はいますか

4

1 に答える 1