ASP.NET MVC - 从控制器代码当前操作?(ASP.NET MVC - Current A

2019-08-05 02:02发布

这是非常相似的另一个最近的问题:

我怎样才能返回一个ASP.NET MVC视图当前的动作?

不过,我想从控制器代码中获得当前活动的名称。

因此多数民众赞成由一个操作调用函数的代码中,我想目前的行动名称的字符串。

这可能吗?

Answer 1:

你可以从你这样的控制器类中访问路径数据:

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

或者,如果“行动”是不是你的路线的必需部分,你可以索引到路由数据按往常一样。



Answer 2:

我能想到的唯一的办法,就是使用的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() ;
    }
}


Answer 3:

那么如果你是在控制你知道的动作被称为什么。 我猜测,你有在需要根据所调用的动作表现不同的控制器所使用的类。 如果是这样的话,那么我会通过动作的字符串表示成从动作方法中需要此信息的对象。 从你一些示例代码会很明确你需要做什么。 下面是我想到的一些示例代码:

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);
}


文章来源: ASP.NET MVC - Current Action from controller code?