2009-04-26 3 views
9

Wir wissen, dass das ASP.NET MVC-Framework mithilfe von Reflection ermittelt, welche Controller/Aktionen basierend auf welcher Klasse ausgeführt werden können von System.Web.Mvc.Controller und von diesen Klassen, welche Methoden ein ActionResult Objekt zurückgeben.Zugriff auf die Liste der Controller/Aktionen in einer ASP.NET MVC-Anwendung

Zu meiner Frage - ist es möglich, aus meiner MVC-Anwendung auf diese Liste von Controllern/Aktionen zuzugreifen?

(Ich könnte es selbst tun, indem ich Reflektion auf der aktuellen Baugruppe, aber wenn die Liste bereits von ASP.NET MVC erstellt wurde, würde ich lieber diese Bemühungen wiederverwenden, als das Rad selbst neu zu erfinden.)

Antwort

15

new ReflectedControllerDescriptor(typeof(TController)).GetCanonicalActions() gibt eine Sammlung von ActionDescriptor-Objekten zurück, die alle Aktionen auf dem Controller anzeigen. Es ist nicht schlau genug, Dinge wie Auswahlattribute oder Namensattribute zu verstehen, daher ist nicht garantiert, dass jede Aktion, die es zurückgibt, vom Web abrufbar ist. Wenn Sie die Aktionen jedoch direkt ausführen müssen, können Sie ActionDescriptor.Execute() für jede Aktion aufrufen, die für Sie von Interesse ist.

6

Dies erfolgt in einer internal Klasse in der System.Web.Mvc Baugruppe mit der Bezeichnung System.Web.Mvc.ControllerTypeCache.

Übrigens sind keine Aktionsmethoden erforderlich, um ActionResult zurückzugeben. Sie können zum Beispiel glücklich void zurückgeben.

+0

Könnte es sich lohnen zu klären, was eine Aktion auf einem Controller ausmacht. Jede öffentliche Methode auf einem Controller kann als eine Aktion angesehen werden, die ich glaube. – AnthonyWJones

+0

Ja. Wenn nicht explizit als "[NonAction]" deklariert, natürlich. –

Verwandte Themen