2009-04-26 17 views
9

舞台裏では、ASP.NET MVCフレームワークはリフレクションを使用して、実行可能なコントローラ/アクションを決定しますSystem.Web.Mvc.Controllerから、これらのクラスのうちどのメソッドがActionResultオブジェクトを返すかを指定します。ASP.NET MVCアプリケーションのコントローラ/アクションリストへのアクセス

私の質問には、MVCアプリケーション内からコントローラ/アクションのこのリストにアクセスすることは可能ですか?

(現行のアセンブリでリフレクションを使用して自分自身で行うこともできますが、リストが既にASP.NET MVCによって構築されている場合は、ホイールを自分で再作成するよりもむしろ再利用したいと思います。 )

答えて

15

new ReflectedControllerDescriptor(typeof(TController)).GetCanonicalActions()は、コントローラー上のすべてのアクションを示すActionDescriptorオブジェクトのコレクションを返します。選択属性や名前付け属性などのことを理解するほどスマートではないため、返すアクションはすべてWeb呼び出し可能であるとは限りません。しかし、アクションを直接実行する必要がある場合は、関心のあるアクションに対してActionDescriptor.Execute()を呼び出すことができます。

6

これは、System.Web.Mvc.ControllerTypeCacheというSystem.Web.Mvcアセンブリのinternalクラスで行われます。

ところで、ActionResultを返すためにアクションメソッドは必要ありません。例えば、彼らはvoidをうれしく返すことができます。

+0

コントローラーで何が処理されるかを明確にする価値があるかもしれません。コントローラ上のパブリックメソッドは、私が信じるアクションと見ることができます。 – AnthonyWJones

+0

うん。もちろん、 '[NonAction]'として明示的に宣言されている場合を除きます。 –

関連する問題