2009-12-29 7 views

Antwort

9

ActionExecutingContext hat eine Eigenschaft ActionDescriptor.

Wenn der Rückgabetyp tatsächlich ein ReflectedActionDescriptor ist, sollten Sie in der Lage zu wirken ist als solche. Sobald Sie eine ReflectedActionDescriptor haben ...

http://msdn.microsoft.com/en-us/library/system.web.mvc.reflectedactiondescriptor.aspx

... können Sie verwenden, es ist Method Eigenschaft ...

http://msdn.microsoft.com/en-us/library/system.web.mvc.reflectedactiondescriptor.methodinfo.aspx

sollten Sie vorsichtig sein, Techniken, die den Namen der Aktion nehmen und Verwenden Sie dies, um eine MethodInfo zu erhalten. In vielen Fällen entspricht der Name einer Aktion dem Methodennamen auf dem Controller, dies ist jedoch nicht immer der Fall. Wenn Sie das Attribut ActionName für die Methode des Controllers verwenden, können Sie den Namen der Aktion explizit festlegen. Darüber hinaus ist es möglich, zwei Methoden mit unterschiedlichen Signaturen zu verwenden, die beide den gleichen Aktionsnamen haben. Dies ist üblich, wenn Sie eine GET- und POST-Version der gleichen Aktion haben (z. B. die Register- und LogOn-Aktionen in einem brandneuen ASP.NET MVC-Projekt in AccountController.cs).

+0

Das MVC-Framework selbst keine anderen Typen hat, die 'ActionDescriptor' erben. – SLaks

+0

In der Tat. Also sollten Sie immer einen ReflectedActionDescriptor bekommen und mein Ansatz wird funktionieren. Ich habe das Wort "if" als Versicherung für zukünftige Versionen von MVC verwendet und vorgeschlagen, dass der Code zum Darstellen des ActionDescriptor mit dieser Möglichkeit geschrieben werden sollte. –

+0

Ich weiß, das ist sehr alt, aber wenn Sie eine Task/Async-Aktionsmethode haben, dann ist es nicht ReflectedActionDescription, sondern TaskAsyncActionDescription. Dies könnte Probleme verursachen. –

1

Versuchen Sie Controller.GetType.GetMethod(actionExecutingContext.ActionName). Wenn sich Ihr Code direkt in der Aktion befindet, können Sie auch MethodBase.GetCurrentMethod() anrufen.

+1

Wie funktioniert die GetMethod-Lösung, wenn mehrere Methoden mit demselben Namen verwendet werden? Zum Beispiel zwei Überladungen zu LogOn oder Register (ein akzeptierender POST und der andere GET). Es ist auch möglich, das ActionName-Attribut zu verwenden, um den Namen der Aktion vom Methodennamen zu unterscheiden. –

+2

Es würde nicht. Deine Antwort ist viel besser. – SLaks

1

Ich musste die MethodInfo abrufen, um meine benutzerdefinierten Attribute für einige Protokollierungszwecke abzurufen.

Für diesen speziellen Anwendungsfall habe ich festgestellt, dass (mindestens in MVC5) eine ActionDescriptor.GetCustomAttributes Methode existiert, und es ordnungsgemäß für jede ActionDescroptor Nachkommen überschrieben wird.

Ebenso gibt es andere verwandte Methoden wie GetParameters usw.