ASP.NET MVC - текущее действие с кода контроллера?

Это очень похоже на другой недавний вопрос:

Как вернуть текущее действие в представлении ASP.NET MVC?

Однако я хочу получить имя текущего действия из кода контроллера.

Итак, в коде функции, вызываемой действием, я хочу получить строку имени текущего Action.

Возможно ли это?

Ответ 1

Вы можете получить доступ к данным маршрута из своего класса контроллера следующим образом:

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

Или, если "действие" не является обязательной частью вашего маршрута, вы можете просто индексировать данные маршрута в обычном режиме.

Ответ 2

Единственный способ, о котором я могу думать, - использовать класс 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() ;
    }
}

Ответ 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);
}