Vra

Dit is baie soortgelyk aan 'n ander onlangse vraag:

Hoe kan ek die huidige aksie in 'n ASP.NET MVC oog terugkeer?

Maar ek wil hê dat die naam van die huidige aksie te kry van binne kontroleerder -kode.

So binne die kode van 'n funksie wat is genoem deur 'n Aksie, ek wil 'n string van die naam van die huidige aksie te kry.

Is dit moontlik?

Was dit nuttig?

Oplossing

Jy kan toegang tot die roete data vanuit jou kontroleerder klas soos volg:

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

Of, as "aksie" is nie 'n vereiste deel van jou roete, jy kan net indeks in die roete data soos gewoonlik.

Ander wenke

Die enigste manier wat ek kan dink, is om die StackFrame klas. Ek sou dit nie aanbeveel as jy met prestasie kritieke kode, maar jy kan dit gebruik. Die enigste probleem is, die StackFrame gee jou al die metodes wat tot dusver genoem op hierdie punt, maar daar is geen maklike manier om te bepaal watter van hierdie is die Aksie metode, maar miskien in jou situasie weet jy hoeveel lae die aksie wees. Hier is 'n paar voorbeelde kode:

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

Wel, as jy in die beheerder jy weet watter stappe gedoen genoem. Ek vermoed dat jy 'n klas wat gebruik word in die kontroles wat nodig het om anders op te tree op grond van die aksie wat word genoem. As dit die geval is, dan sou ek verby 'n string voorstelling van die aksie in die voorwerp wat hierdie inligting moet van binne die aksie metode. Sommige voorbeeld kode van jou sou regtig te verduidelik wat jy hoef te doen. Hier is 'n paar voorbeelde kode wat ek dink:

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);
}
Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top