2009-09-11 28 views

cevap

17

: Aşağıda bir örnek kod var , sadece normalde olduğu gibi rota verisine indeksleyebilirsiniz.

1

Düşünebilmemin tek yolu, StackFrame sınıfını kullanmaktır. Performansla ilgili kritik kodla uğraşıyorsanız bunu tavsiye etmem ama bunu kullanabilirsiniz. Tek sorun şu ki, StackFrame size bu noktaya kadar çağrılmış olan tüm yöntemleri sunar, ancak bunlardan hangisinin Action yöntemi olduğunu belirlemenin kolay bir yolu yoktur, fakat belki de sizin durumunuzda, Eylem'in kaç katmanı olacağını bilirsiniz. olmak. "Eylem" rotanız gerekli bir parçası değilse,

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

Veya: Böyle Denetleyiciniz sınıf içinde rota verilerine erişebilir

[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

Eğer denetleyicide iseniz, hangi eylemin çağrıldığını biliyorsunuzdur. Denetleyicide, çağrılan eyleme göre farklı davranması gereken bir sınıfın olduğunu tahmin ediyorum. Eğer durum buysa, eylemin içinden, bu bilgiye ihtiyaç duyan nesneye eylemin dize halinde temsilini iletirim. Sizden bazı örnek kodlar yapmanız gerekeni gerçekten açıklığa kavuşturur. İşte düşünüyorum bazı örnek kod:

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); 
} 
İlgili konular