2009-09-11 20 views

Répondre

17

Vous pouvez accéder aux données d'itinéraire à partir de votre classe contrôleur comme ceci:

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

Ou, si « action » ne fait pas partie nécessaire de votre itinéraire , vous pouvez simplement indexer dans les données de route comme d'habitude.

1

La seule façon que je peux penser, est d'utiliser la classe StackFrame. Je ne le recommanderais pas si vous traitez du code critique de performance, mais vous pouvez l'utiliser. Le seul problème est, le StackFrame vous donne toutes les méthodes qui ont été appelées jusqu'à présent, mais il n'y a pas de moyen facile d'identifier lequel est la méthode d'action, mais peut-être dans votre situation, vous savez combien de couches l'Action être. Voici quelques exemples de code:

[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

Eh bien, si vous êtes dans le contrôleur, vous savez quelle action est appelée. Je devine que vous avez une classe qui est utilisée dans le contrôleur qui doit se comporter différemment en fonction de l'action qui est appelée. Si tel est le cas, je passerais une représentation sous forme de chaîne de l'action dans l'objet qui a besoin de cette information à partir de la méthode d'action. Un exemple de code de votre part clarifierait vraiment ce que vous devez faire. Voici un exemple de code que je pense:

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