Domanda

Questo è molto simile a un'altra domanda recente:

Come posso restituire l'azione corrente in una vista MVC ASP.NET?

Tuttavia, desidero ottenere il nome dell'azione corrente dal controller codice

Quindi, all'interno del codice di una funzione chiamata da un'azione, voglio ottenere una stringa del nome dell'azione corrente.

È possibile?

È stato utile?

Soluzione

Puoi accedere ai dati del percorso dalla tua classe controller in questo modo:

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

Oppure, se " azione " non è una parte obbligatoria del percorso, puoi indicizzare i dati del percorso come al solito.

Altri suggerimenti

L'unico modo a cui riesco a pensare è usare Classe StackFrame . Non lo consiglierei se hai a che fare con un codice critico per le prestazioni, ma potresti usarlo. L'unico problema è che StackFrame ti offre tutti i metodi che sono stati richiamati fino a questo punto, ma non esiste un modo semplice per identificare quale di questi è il metodo Action, ma forse nella tua situazione sai quanti layer up l'Action farà essere. Ecco un po 'di codice di esempio:

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

Bene, se sei nel controller sai quale azione viene chiamata. Immagino che tu abbia una classe utilizzata nel controller che deve comportarsi diversamente in base all'azione che viene chiamata. In tal caso, passerei una rappresentazione di stringa dell'azione nell'oggetto che necessita di queste informazioni all'interno del metodo di azione. Qualche codice di esempio da te chiarirebbe davvero cosa devi fare. Ecco qualche codice di esempio che sto 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);
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top