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が呼び出され、AliasedMethodsとNonAliasedMethods (直接ルートを持つすべてのアクションが除外されます) のみが参照されます。
ReflectedControllerDescriptor.GetCanonicalActionsが呼び出されると、内部的にReflectedControllerDescriptor.GetAllActionMethodsFromSelectorが呼び出されます。これはAliasedMethodsとNonAliasedMethods (直接ルートを持つすべてのアクションを除外します) のみを調べます。
私が見る限り、DirectRouteMethodsはRouteCollection.MapMvcAttributeRoutes 拡張メソッドの 1 か所でのみ使用されます。これは、RouteTable.RoutesコレクションにアクションへのRouteCollectionRouteがあることを意味しますが、そこに到達する方法がわかりません。
RouteAttributeを持つアクションのActionDescriptorを取得する方法を知っている人はいますか