Wie bekomme ich den ActionDescriptor eines Mvc 5 Controllers, wenn ich Attribute Routing verwende?

9

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.

  • AliasedMethods - Alle Aktionsmethoden ohne direkte Routen, die mit ActionNameSelectorAttribute dekoriert sind.
  • NonAliasedMethods - Alle Aktionsmethoden ohne direkte Routen, die nicht mit ActionNameSelectorAttribute dekoriert sind.

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

  • DirectRouteMethods - Methoden mit einer Form von IRouteInfoProvider, die sie direkt verzieren.
  • StandardRouteMethods - Methoden ohne IRouteInfoProvider, die sie direkt verzieren. (Enthält Aktionsmethoden in einem Controller mit RouteAttribute, für die die Methode jedoch kein RouteAttribute enthält.)

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

?     
Christopher Haws 03.03.2014, 02:41
quelle

1 Antwort

1

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: Ссылка

    
NightOwl888 04.06.2014, 18:04
quelle