2009-09-11 5 views

Antwort

17

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

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

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

1

Die einzige Möglichkeit, die ich mir vorstellen kann, ist die StackFrame Klasse zu verwenden. Ich würde es nicht empfehlen, wenn Sie mit leistungskritischem Code arbeiten, aber Sie könnten es verwenden. Das einzige Problem ist, dass der StackFrame alle Methoden bietet, die bisher aufgerufen wurden, aber es gibt keinen einfachen Weg, um herauszufinden, welche davon die Aktionsmethode ist, aber vielleicht wissen Sie in Ihrer Situation, wie viele Ebenen die Aktion ausführen wird 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() ; 
    } 
} 
1

Nun, wenn Sie in der Steuerung sind, wissen Sie, welche Aktion aufgerufen wird. Ich nehme an, dass Sie eine Klasse haben, die in der Steuerung verwendet wird, die sich basierend auf der Aktion, die aufgerufen wird, anders verhalten muss. Wenn das der Fall ist, würde ich eine String-Repräsentation der Aktion in das Objekt übergeben, das diese Information innerhalb der Aktionsmethode benötigt. Ein Beispielcode von Ihnen würde wirklich klarstellen, was Sie tun müssen. Hier ist ein Beispielcode, den 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); 
}