2009-12-29 4 views

답변

9

ActionExecutingContext에는 ActionDescriptor 속성이 있습니다.

의 경우 반환 유형은 실제로 ReflectedActionDescriptor이므로 캐스팅 할 수 있어야합니다. 당신이 ReflectedActionDescriptor이 있으면 ...

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

... 당신이 작업의 이름을 기술을 사용하여

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

당신은 조심해야한다 ... 그것은 MethodInfo 속성의 사용 및 이것을 사용하여 MethodInfo를 얻습니다. 많은 경우 액션의 이름은 컨트롤러의 메소드 이름과 같지만 항상 그런 것은 아닙니다. 컨트롤러 메서드에서 ActionName 특성을 사용하면 명시 적으로 동작의 이름을 설정할 수 있습니다. 또한 동일한 액션 이름을 사용하여 서명이 다른 두 개의 메소드를 가질 수 있습니다. 이는 GET 및 POST 버전의 동일한 작업 (예 : AccountController.cs 내의 새로운 ASP.NET MVC 프로젝트에 Register 및 LogOn 작업이 있음)이있는 경우에 일반적으로 발생합니다.

+0

자체'ActionDescriptor' 상속 다른 종류가없는 MVC 프레임 워크 GetParameters 같은 다른 종래의 방법이있다. – SLaks

+0

실제로. 따라서 항상 ReflectedActionDescriptor를 얻어야하며 내 접근 방식이 효과적입니다. 나는 "if"라는 단어를 MVC의 차기 버전에 대한 보험으로 사용하고 ActionDescriptor를 전달하는 코드가이 가능성을 염두에두고 작성되어야한다고 제안했다. –

+0

저는 이것이 매우 오래된 것임을 알고 있습니다 만, Task/Async 작업 방법이 있다면 ReflectedActionDescription이 아니라 TaskAsyncActionDescription입니다. 이로 인해 문제가 발생할 수 있습니다. –

1

시도 Controller.GetType.GetMethod(actionExecutingContext.ActionName).

코드가 조치에 직접 관련된 경우 MethodBase.GetCurrentMethod()으로 전화 할 수도 있습니다.

+1

GetMethod 솔루션은 동일한 이름을 가진 여러 메서드가있는 곳에서 어떻게 작동합니까? 예를 들어 LogOn 또는 Register에 두 개의 오버로드가 발생합니다 (POST 및 다른 GET을 수락하는 서버). 또한 ActionName 속성을 사용하여 액션 이름을 메소드 이름과 매우 다르게 만들 수 있습니다. –

+2

그렇지 않습니다. 당신의 대답은 훨씬 낫습니다. – SLaks

1

일부 로깅 목적으로 MethodInfo에 내 사용자 지정 특성을 가져와야했습니다.

이 특정 사례에 대해 (적어도 MVC5에서) ActionDescriptor.GetCustomAttributes 메서드가 존재하며 각 ActionDescroptor 자손에 대해 올바르게 재정의되었음을 확인했습니다.

마찬가지로 등

관련 문제