Pregunta

Esto es muy similar a otra pregunta reciente:

¿Cómo puedo devolver la acción actual en una vista MVC de ASP.NET?

Sin embargo, quiero obtener el nombre de la acción actual dentro del código controller .

Entonces, dentro del código de una función que está siendo llamada por una Acción, quiero obtener una cadena con el nombre de la Acción actual.

¿Es esto posible?

¿Fue útil?

Solución

Puede acceder a los datos de ruta desde su clase de controlador de esta manera:

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

O, si " acción " no es una parte obligatoria de su ruta, solo puede indexar los datos de ruta como de costumbre.

Otros consejos

La única forma en la que puedo pensar es usar Clase StackFrame . No lo recomendaría si está tratando con un código crítico de rendimiento, pero podría usarlo. El único problema es que el StackFrame le brinda todos los métodos que se han llamado hasta este punto, pero no hay una manera fácil de identificar cuál de estos es el método de Acción, pero quizás en su situación sepa cuántas capas de acción hará la Acción. ser. Aquí hay un código de ejemplo:

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

Bueno, si estás en el controlador, sabes a qué acción se llama. Supongo que usted tiene una clase que se está utilizando en el controlador que necesita comportarse de manera diferente en función de la acción que se está llamando. Si ese es el caso, entonces pasaría una representación de cadena de la acción al objeto que necesita esta información desde dentro del método de acción. Algún código de muestra de usted realmente aclararía lo que necesita hacer. Aquí hay un código de ejemplo que estoy 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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top