Pergunta

Isto é muito semelhante a uma outra pergunta recente:

Como posso devolver a ação atual em uma visão ASP.NET MVC?

No entanto, eu quero pegar o nome da ação atual de dentro controller código.

Assim, dentro do código de uma função que está sendo chamado por uma ação, eu quero ter uma seqüência de caracteres do nome da ação atual.

Isso é possível?

Foi útil?

Solução

Você pode acessar os dados de rota de dentro de sua classe de controlador como este:

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

Ou, se "ação" não é uma parte necessária de sua rota, você pode simplesmente índice para os dados de percurso, como por habitual.

Outras dicas

A única maneira que eu posso pensar, é usar o StackFrame classe. Eu não recomendo se você está lidando com código crítico de desempenho, mas você pode usá-lo. O único problema é, o StackFrame dá-lhe todos os métodos que foram chamados até este ponto, mas não há nenhuma maneira fácil de identificar qual destes é o método de ação, mas talvez em sua situação você sabe quantas camadas até a ação estar. Aqui está um código de exemplo:

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

Bem, se você estiver no controlador que você sabe o que ação está sendo chamado. Eu estou supondo que você tem uma classe que está sendo usado no controlador que precisa se comportar de forma diferente com base na ação que está sendo chamado. Se for esse o caso, então eu iria passar uma representação em cadeia da ação no objeto que precisa dessas informações de dentro do método de ação. Um código de exemplo de que você realmente esclarecer o que você está precisando fazer. Aqui está um código de exemplo que eu estou pensando:

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);
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top