2009-09-11 40 views
13

này rất giống với một câu hỏi gần đây:ASP.NET MVC - Hành động hiện tại từ mã điều khiển?

How can I return the current action in an ASP.NET MVC view?

Tuy nhiên, tôi muốn để có được tên của hành động hiện tại từ bên trong khiển mã.

Vì vậy, trong mã của một hàm đang được gọi bởi một hành động, tôi muốn nhận được một chuỗi tên của hành động hiện tại.

Điều này có khả thi không?

Trả lời

17

Bạn có thể truy cập dữ liệu tuyến đường từ bên trong lớp điều khiển của bạn như thế này:

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

Hoặc, nếu "hành động" không phải là một phần bắt buộc trong tuyến đường của bạn , bạn chỉ có thể lập chỉ mục vào dữ liệu tuyến đường như bình thường.

1

Cách duy nhất tôi có thể nghĩ đến là sử dụng lớp StackFrame. Tôi sẽ không khuyên bạn nên nó nếu bạn đang đối phó với mã hiệu suất quan trọng, nhưng bạn có thể sử dụng nó. Vấn đề duy nhất là, StackFrame cung cấp cho bạn tất cả các phương thức đã được gọi đến thời điểm này, nhưng không có cách nào dễ dàng để xác định phương thức nào trong số này là phương thức Hành động, nhưng có thể trong tình huống của bạn, bạn biết sẽ có bao nhiêu lớp được. Dưới đây là một số mẫu mã:

[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

Nếu bạn ở trong bộ điều khiển, bạn biết hành động nào đang được gọi. Tôi đoán rằng bạn có một lớp đang được sử dụng trong bộ điều khiển cần hành xử khác nhau dựa trên hành động đang được gọi. Nếu đó là trường hợp sau đó tôi sẽ vượt qua một chuỗi đại diện của hành động vào đối tượng cần thông tin này từ bên trong phương thức hành động. Một số mã mẫu từ bạn sẽ thực sự làm rõ những gì bạn cần làm. Dưới đây là một số mã mẫu mà tôi đang suy nghĩ:

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); 
} 
Các vấn đề liên quan