2009-09-11 29 views

Respuesta

17

Puede acceder a los datos de la ruta desde dentro de su clase controlador de esta manera:

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

O, si la "acción" no es una parte necesaria de su ruta , puede simplemente indexar los datos de ruta como de costumbre.

1

La única forma en que se me ocurre es usar la clase StackFrame. No lo recomendaría si está tratando con código de rendimiento crítico, pero podría usarlo. El único problema es que StackFrame le proporciona todos los métodos que se han invocado hasta el momento, pero no hay una manera fácil de identificar cuál de estos es el método de Acción, pero tal vez en su situación sepa cuántas capas de la Acción ser. He aquí algunos ejemplos de código:

[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

Bueno, si estás en el controlador, sabes a qué acción se está llamando. Supongo que tiene una clase que se usa en el controlador que necesita comportarse de manera diferente en función de la acción que se está convocando. Si ese es el caso, entonces pasaría una representación de cadena de la acción en el objeto que necesita esta información desde dentro del método de acción. Un código de muestra de usted realmente aclararía lo que necesita hacer. Aquí hay un código de muestra que estoy 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); 
} 
Cuestiones relacionadas