这与最近的另一个问题非常相似:
How can I return the current action in an ASP.NET MVC view?
但是,我想从 controller 代码中获取当前操作的名称。
因此,在Action调用的函数的代码中,我想获取当前Action名称的字符串。
这可能吗?
答案 0 :(得分:17)
您可以从控制器类中访问路径数据,如下所示:
var actionName = ControllerContext.RouteData.GetRequiredString("action");
或者,如果“行动”不是您路线的必需部分,您可以按照惯例索引路线数据。
答案 1 :(得分:1)
我能想到的唯一方法是使用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() ;
}
}
答案 2 :(得分:1)
如果你在控制器中,你知道正在调用什么动作。我猜你有一个正在控制器中使用的类,需要根据被调用的动作表现不同。如果是这种情况,那么我会将操作的字符串表示传递给需要来自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);
}