Question

Cela ressemble beaucoup à une autre question récente:

Comment puis-je renvoyer l'action en cours dans une vue ASP.NET MVC?

Toutefois, je souhaite obtenir le nom de l'action en cours dans le code du contrôleur .

Donc, dans le code d'une fonction appelée par une action, je souhaite obtenir une chaîne du nom de l'action en cours.

Est-ce possible?

Était-ce utile?

La solution

Vous pouvez accéder aux données de route depuis votre classe de contrôleur de la manière suivante:

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

Ou, si "action" n'est pas une partie obligatoire de votre itinéraire, vous pouvez simplement indexer dans les données de l'itinéraire comme d'habitude.

Autres conseils

Le seul moyen auquel je puisse penser consiste à utiliser StackFrame classe. Je ne le recommanderais pas si vous traitez avec du code essentiel à la performance, mais vous pouvez l'utiliser. Le seul problème est que StackFrame vous donne toutes les méthodes qui ont été appelées jusqu'à présent, mais il n'y a pas de moyen facile d'identifier laquelle de ces méthodes est la méthode Action, mais peut-être que dans votre cas, vous savez combien de couches jusqu'à l'Action être. Voici un exemple de code:

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

Eh bien, si vous êtes dans le contrôleur, vous savez quelle action est appelée. Je suppose que vous avez une classe utilisée dans le contrôleur qui doit se comporter différemment en fonction de l'action appelée. Si tel est le cas, je passerais une représentation sous forme de chaîne de l'action à l'objet qui a besoin de cette information depuis la méthode d'action. Un exemple de code de votre part clarifierait vraiment ce que vous devez faire. Voici un exemple de code auquel je pense:

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);
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top