这是非常相似的另一个最近的问题:
我怎样才能返回一个ASP.NET MVC视图当前的动作?
不过,我想从控制器代码中获得当前活动的名称。
因此多数民众赞成由一个操作调用函数的代码中,我想目前的行动名称的字符串。
这可能吗?
这是非常相似的另一个最近的问题:
我怎样才能返回一个ASP.NET MVC视图当前的动作?
不过,我想从控制器代码中获得当前活动的名称。
因此多数民众赞成由一个操作调用函数的代码中,我想目前的行动名称的字符串。
这可能吗?
你可以从你这样的控制器类中访问路径数据:
var actionName = ControllerContext.RouteData.GetRequiredString("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() ;
}
}
那么如果你是在控制你知道的动作被称为什么。 我猜测,你有在需要根据所调用的动作表现不同的控制器所使用的类。 如果是这样的话,那么我会通过动作的字符串表示成从动作方法中需要此信息的对象。 从你一些示例代码会很明确你需要做什么。 下面是我想到的一些示例代码:
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);
}