2009-04-26 11 views
9

Sappiamo che dietro le quinte, il framework ASP.NET MVC utilizzerà il reflection per determinare quali controller/azioni sono disponibili per l'esecuzione, in base a quali classi derivano da System.Web.Mvc.Controller e, di tali classi, quali metodi restituiscono un oggetto ActionResult.Accesso all'elenco di controller/azioni in un'applicazione ASP.NET MVC

Alla mia domanda: è possibile accedere a questo elenco di controller/azioni dall'applicazione MVC?

(Potrei farlo da solo, utilizzando la riflessione sull'assieme corrente, ma se l'elenco è già stato creato da ASP.NET MVC, preferirei riutilizzare tale sforzo piuttosto che reinventare la ruota da solo.

risposta

15

new ReflectedControllerDescriptor(typeof(TController)).GetCanonicalActions() restituirà una raccolta di oggetti ActionDescriptor che mostrano tutte le azioni sul controller. Non è abbastanza intelligente da capire cose come gli attributi di selezione o gli attributi di denominazione, quindi non tutte le azioni restituite sono garantite come web-callable. Ma se devi eseguire direttamente le azioni, puoi chiamare ActionDescriptor.Execute() su qualsiasi azione di tuo interesse.

6

Questa operazione viene eseguita in una classe internal nell'assembly System.Web.Mvc denominato System.Web.Mvc.ControllerTypeCache.

A proposito, i metodi di azione non sono necessari per restituire ActionResult. Possono restituire felicemente void, ad esempio.

+0

Potrebbe essere opportuno chiarire che cosa costituisce un'azione su un controller. Qualsiasi metodo pubblico su un controller può essere visto come un'azione che io credo. – AnthonyWJones

+0

Sì. A meno che non sia dichiarato esplicitamente come '[NonAction]', naturalmente. –