Ich versuche, einen ActionDescriptor für eine Aktion auf einem Controller abzurufen, der Attribut-Routing verwendet, er ist jedoch immer null.
%Vor%Aus meinen Nachforschungen habe ich herausgefunden, dass es in der Klasse ActionMethodSelectorBase eine Methode namens PopulateLookupTables gibt, die alle Methoden in dem von Ihnen angegebenen Controller aufteilt. Innerhalb dieser Methode filtert es die Liste der MethodInfo's in 2 Gruppen von Listen.
HINWEIS: AliasedMethods und NonAliasedMethods sind leer, wenn eine direkte Route (RouteAttribute) auf der Controller-Ebene festgelegt wird.
HINWEIS: Direkte Routen sind als Methoden definiert, die sich in einem Controller befinden (Konstruktoren und Ereignisse ausgenommen) und mit einem Attribut versehen sind, das IRouteInfoProvider oder IDirectRouteFactory erbt (RouteAttribute erbt von beiden).
und
Wenn ReflectedControllerDescriptor.FindAction aufgerufen wird, ruft es intern ActionMethodSelectorBase.FindActionMethods auf, das nur die AliasedMethods und NonAliasedMethods betrachtet. strong> (die alle Aktionen mit direkten Routen ausschließen).
Wenn ReflectedControllerDescriptor.GetCanonicalActions aufgerufen wird, ruft es intern ReflectedControllerDescriptor.GetAllActionMethodsFromSelector auf, das nur die AliasedMethods und NonAliasedMethods betrachtet. strong> (die alle Aktionen mit direkten Routen ausschließen).
Von dem, was ich sehen kann, werden die DirectRouteMethods nur an einer Stelle verwendet, die RouteCollection.MapMvcAttributeRoutes Erweiterungs-Methoden. Das bedeutet, dass die RouteTable.Routes -Auflistung eine RouteCollectionRoute für die Aktion enthält, aber ich bin nicht sicher, wie ich dazu komme.
Kennt jemand einen ActionDescriptor für eine Aktion mit einem RouteAttribute
?Sie können dazu die AsyncControllerActionInvoker-Klasse verwenden, aber da die von Ihnen benötigte Methode geschützt ist, müssen Sie zuerst die Klasse erben und die Methode als public definieren.
%Vor%Dann ist es nur eine Frage der Verwendung der gleichen 2 Objekte, die Sie zuvor hatten, um die neue Methode aufzurufen.
%Vor%Beachten Sie, dass dies sowohl für StandardRouteMethods als auch für DirectRouteMethods funktioniert.
Beachten Sie jedoch, dass das Aufrufen dieser Methode die RouteData für die Eigenschaften controllerContext.RouteData und controllerContext.RequestContext.RouteData auf die der gefundenen Aktion zurücksetzt. Daher müssen Sie die ControllerContext- und RequestContext-Klassen umbrechen und die RouteData-Eigenschaften neu implementieren, damit der Setter keine Auswirkungen hat, wenn es wichtig ist, dass Sie den Kontext nicht zerstören.
Referenz: Ссылка
Tags und Links asp.net-mvc c# asp.net-mvc-5 asp.net-mvc-routing attributerouting