2009-12-29 18 views

Respuesta

9

ActionExecutingContext tiene una propiedad ActionDescriptor.

Si el tipo de devolución es realmente un ReflectedActionDescriptor que debería poder lanzar es como tal. Una vez que tenga un ReflectedActionDescriptor ...

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

... se puede usar la propiedad MethodInfo ...

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

usted debe tener cuidado usando técnicas que toman el nombre de la acción y use esto para obtener un MethodInfo. En muchos casos, el nombre de una acción será el mismo que el nombre del método en el controlador, pero este no siempre será el caso. Si usa el atributo ActionName en el método del controlador, puede establecer explícitamente el nombre de la acción. Además, es posible tener 2 métodos con diferentes firmas, ambos con el mismo nombre de acción. Esto es común cuando tiene una versión GET y POST de la misma acción (por ejemplo, las acciones Register y LogOn presentes en un nuevo proyecto ASP.NET MVC dentro de AccountController.cs).

+0

El marco MVC sí no tiene ningún otro tipo que heredan 'ActionDescriptor'. – SLaks

+0

De hecho. Por lo tanto, siempre debe obtener un ReflectedActionDescriptor y mi enfoque funcionará. Utilicé la palabra "si" como seguro para versiones futuras de MVC, y sugerir que el código para transmitir el ActionDescriptor se debe escribir teniendo en cuenta esta posibilidad. –

+0

Sé que esto es muy antiguo, pero si tiene un método de acción Task/Async, entonces no es ReflectedActionDescription, sino TaskAsyncActionDescription. Esto podría causar problemas. –

1

Probar Controller.GetType.GetMethod(actionExecutingContext.ActionName).

Si su código está directamente en la acción, también puede llamar al MethodBase.GetCurrentMethod().

+1

¿Cómo funcionaría la solución GetMethod donde hay varios métodos con el mismo nombre? Por ejemplo, dos sobrecargas para Iniciar sesión o Registrarse (una que acepta POST y la otra GET). Además, es posible usar el atributo ActionName para hacer que el nombre de la acción sea muy diferente al nombre del método. –

+2

No lo haría. Tu respuesta es mucho mejor – SLaks

1

Necesitaba obtener el MethodInfo para recuperar mis atributos personalizados con fines de registro.

Para este caso de uso específico noté que (al menos en MVC5) existe un método ActionDescriptor.GetCustomAttributes, y se anula correctamente para cada descendiente .

Del mismo modo, hay otros métodos relacionados, como GetParameters, etc.

Cuestiones relacionadas