2009-09-11 12 views
13

これは別の最近の質問に非常に似ていますASP.NET MVC - コントローラコードからの現在のアクション?

How can I return the current action in an ASP.NET MVC view?

はしかし、私はコントローラコード内から現在のアクションの名前を取得したいです。

したがって、アクションによって呼び出されている関数のコード内で、現在のアクションの名前の文字列を取得する必要があります。

これは可能ですか?

答えて

17

:ここではいくつかのサンプルコードですいつも通り、ルートデータにインデックスを付けることができます。

1

私が考えることができる唯一の方法は、StackFrameクラスを使用することです。パフォーマンスクリティカルなコードを扱っている場合はお勧めできませんが、使用することは可能です。唯一の問題は、StackFrameはこの時点までに呼び出されたすべてのメソッドを提供しますが、Actionメソッドであることを識別する簡単な方法はありませんが、あなたの状況では、さあ。 「アクション」は、あなたのルートの必要な部分ではない場合、

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

または:あなたはこのようなあなたのコントローラクラス内からのルートデータにアクセスすることができ

[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() ; 
    } 
} 
1

コントローラにいれば、どのような動作が呼び出されているのかわかります。私はあなたが、呼び出されているアクションに基づいて異なる振る舞いをする必要があるコントローラで使用されているクラスを持っていると推測しています。その場合、私はアクションメソッド内からこの情報を必要とするオブジェクトにアクションの文字列表現を渡します。あなたのサンプルコードの中には、あなたが何をする必要があるのか​​を明確にするものがあります。私が思っているサンプルコードをいくつか紹介します:

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); 
} 
関連する問題