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