2009-09-11 3 views

risposta

17

È possibile accedere ai dati di rotta dall'interno classe controller in questo modo:

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

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

1

L'unico modo che posso pensare è utilizzare la classe StackFrame. Non lo consiglierei se hai a che fare con codice critico delle prestazioni, ma potresti usarlo. L'unico problema è che StackFrame ti fornisce tutti i metodi che sono stati richiamati fino a questo punto, ma non c'è un modo semplice per identificare quale di questi è il metodo di azione, ma forse nella tua situazione sai quanti livelli in alto l'Azione essere. Ecco alcuni esempi di codice:

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

Bene, se si è nel controller, si conosce l'azione che viene chiamata. Sto indovinando che hai una classe che viene utilizzata nel controller che deve comportarsi in modo diverso in base all'azione che viene chiamata. In tal caso, passerei una rappresentazione stringa dell'azione nell'oggetto che ha bisogno di queste informazioni all'interno del metodo di azione. Alcuni esempi di codice da te chiariscono davvero cosa devi fare. Ecco alcuni esempi di codice 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); 
}