문제

이것은 최근의 또 다른 질문과 매우 유사합니다.

ASP.NET MVC보기에서 현재 조치를 반환하려면 어떻게해야합니까?

그러나 내면에서 현재 행동의 이름을 얻고 싶습니다. 제어 장치 암호.

따라서 행동에 의해 호출되는 함수의 코드 내에서 현재 동작의 이름을 얻고 싶습니다.

이게 가능해?

도움이 되었습니까?

해결책

다음과 같이 컨트롤러 클래스 내에서 경로 데이터에 액세스 할 수 있습니다.

var actionName = ControllerContext.RouteData.GetRequiredString("action");

또는 "ACTION"이 경로의 필수 부분이 아닌 경우 평소와 같이 경로 데이터에 인덱싱 할 수 있습니다.

다른 팁

내가 생각할 수있는 유일한 방법은 stackframe 수업. Performance Critical Code를 다루고 있다면 권장하지 않지만 사용할 수 있습니다. 유일한 문제는 StackFrame 이이 시점까지 호출 된 모든 방법을 제공하지만, 이들 중 어느 것이 액션 방법인지 쉽게 식별 할 수있는 방법은 없지만 상황에서 어떤 계층이 얼마나 많은지를 알 수 있습니다. 이다. 샘플 코드는 다음과 같습니다.

[HandleError]
public class HomeController : Controller
{
    public void Index()
    {
        var x = ShowStackFrame();
        Response.Write(x);
    }

    private string ShowStackFrame()
    {
        StringBuilder b = new StringBuilder();
        StackTrace trace = new StackTrace(0);

        foreach (var frame in trace.GetFrames())
        {
            var method = frame.GetMethod();
            b.AppendLine(method.Name + "<br>");

            foreach (var param in method.GetParameters())
            {
                b.AppendLine(param.Name + "<br>");
            }
            b.AppendLine("<hr>");
        }

        return b.ToString() ;
    }
}

컨트롤러에 있다면 어떤 조치가 호출되는지 알 수 있습니다. 컨트롤러에서 사용되는 클래스가 있다고 추측하고 있습니다. 이 경우 작업의 문자열 표현을 동작 메소드 내 에서이 정보를 필요로하는 객체로 전달합니다. 당신의 일부 샘플 코드는 당신이해야 할 일을 정말로 명확하게 할 것입니다. 다음은 내가 생각하는 몇 가지 샘플 코드입니다.

public ActionResult TestControllerAction()
{
     var action = new TestControllerAction();
     var objectWithBehaviorBasedOnAction = new MyObjectWithBehaviorBasedOnAction();
     objectWithBehaviorBasedOnAction.DoSomething(action);    
}

public class MyObjectWithBehaviorBasedOnAction: IMyBehaviorBasedOnAction
{
    public void DoSomething(IControllerAction action)
    {
      // generic stuff
    }
    public void DoSomething(TestControllerAction action)
    {
       // do behavior A
    }
    public void DoSomething(OtherControllerAction action)
    {
        // do behavior b
    }
}

public interface IMyBehaviorBasedOnAction
{
   void DoSomething(IControllerAction action);
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top