我正在尝试为使用Attribute Routing的控制器上的操作获取ActionDescriptor,但它始终为空。
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扩展方法。这意味着RouteTable.Routes集合有一个RouteCollectionRoute到该操作,但我不知道如何获得它。
有谁知道如何为具有RouteAttribute的操作获取ActionDescriptor