2009-09-11 18 views

Odpowiedz

17

można uzyskać dostęp do danych trasy od wewnątrz swojej klasie kontrolera tak:

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

Lub, jeśli „akcja” nie jest wymaganym elementem trasy , możesz po prostu zaindeksować dane trasy tak jak zwykle.

1

Jedyny sposób, jaki mogę wymyślić, to użycie klasy StackFrame. Nie polecałbym tego, jeśli masz do czynienia z kodem krytycznym pod względem wydajności, ale możesz go użyć. Jedynym problemem jest to, że StackFrame daje ci wszystkie metody, które zostały do ​​tego czasu wywołane, ale nie ma łatwego sposobu na określenie, która z nich jest metodą Akcji, ale może w twojej sytuacji wiesz, ile warstw w górę akcji będzie być. Oto niektóre przykładowy kod:

[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

Cóż, jeśli jesteś w sterowniku, wiesz, jakie działanie jest wywoływane. Zgaduję, że masz klasę, która jest używana w kontrolerze, który musi zachowywać się inaczej w zależności od akcji, która jest wywoływana. Jeśli tak jest, to przekazałbym ciąg znaków reprezentujący akcję do obiektu, który potrzebuje tej informacji z metody działania. Jakiś przykładowy kod naprawdę wyjaśniłby, co musisz zrobić. Oto przykładowy kod, o którym myślę:

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