Frage

Dies ist sehr ähnlich zu einer anderen letzten Frage:

Wie kann ich wieder die aktuelle Aktion in einer ASP.NET MVC-Ansicht?

Allerdings möchte ich den Namen der aktuellen Aktion erhalten innerhalb Controller Code.

So im Code einer Funktion, die durch eine Aktion genannt wird, ich möchte eine Zeichenfolge des Namens der aktuellen Aktion erhalten.

Ist das möglich?

War es hilfreich?

Lösung

Sie können die Routendaten zugreifen aus Ihrer Controller-Klasse wie folgt aus:

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

Oder, wenn „Aktion“ ist nicht ein notwendiger Bestandteil Ihrer Route, können Sie einfach Index in die Routendaten wie üblich.

Andere Tipps

Die einzige Art, wie ich mir vorstellen kann, ist die StackFrame- Klasse. Ich würde es nicht empfehlen, wenn Sie mit der Leistung kritischem Code zu tun hat, aber man konnte es verwenden. Das einzige Problem ist, der StackFrame- gibt Ihnen alle Methoden, die zu diesem Zeitpunkt aufgerufen worden, aber es gibt keine einfache Möglichkeit, die von ihnen zu identifizieren, ist die Aktion-Methode, aber vielleicht in Ihrer Situation weißt, wie viele Schichten auf die Aktion Sein. Hier ist ein Beispielcode:

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

Nun, wenn Sie in der Steuerung sind Sie wissen, welche Aktion aufgerufen wird. Ich vermute, dass Sie eine Klasse, die in der Steuerung verwendet wird, die sich anders verhalten muss auf der Grundlage der Aktion, die aufgerufen wird. Wenn das der Fall ist, dann würde ich eine String-Darstellung der Aktion in das Objekt übergibt, das diese Informationen aus der Aktionsmethode muss. Einige Beispielcode von Ihnen würde wirklich klären, was Sie zu tun brauchen. Hier einige Beispielcode, der ich denke:

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);
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top