これは、最近の別の質問と非常によく似ています。
ASP.NET MVCビューで現在のアクションを返すにはどうすればよいですか?
ただし、コントローラーコード内から現在のアクションの名前を取得したいと思います。
したがって、アクションによって呼び出されている関数のコード内で、現在のアクションの名前の文字列を取得したいと思います。
これは可能ですか?
これは、最近の別の質問と非常によく似ています。
ASP.NET MVCビューで現在のアクションを返すにはどうすればよいですか?
ただし、コントローラーコード内から現在のアクションの名前を取得したいと思います。
したがって、アクションによって呼び出されている関数のコード内で、現在のアクションの名前の文字列を取得したいと思います。
これは可能ですか?
次のように、コントローラー クラス内からルート データにアクセスできます。
var actionName = ControllerContext.RouteData.GetRequiredString("action");
または、「アクション」がルートの必須部分でない場合は、通常どおりルート データにインデックスを付けることができます。
コントローラーにいる場合は、どのアクションが呼び出されているかがわかります。呼び出されているアクションに基づいて異なる動作をする必要があるコントローラーで使用されているクラスがあると思います。その場合は、アクション メソッド内からこの情報を必要とするオブジェクトに、アクションの文字列表現を渡します。あなたからのいくつかのサンプルコードは、あなたが何をする必要があるかを本当に明確にします. ここに私が考えているいくつかのサンプルコードがあります:
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);
}
私が考えることができる唯一の方法は、StackFrameクラスを使用することです。パフォーマンスが重要なコードを扱っている場合はお勧めしませんが、使用することはできます。唯一の問題は、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() ;
}
}