2015-03-10 15 views
7

Tôi đang xây dựng bộ điều khiển công việc đã lên lịch - những công việc này sẽ gọi một điều khiển Điều khiểnHành động ghi lại kết quả. Tôi thà có tất cả điều này xảy ra trên backend và không liên quan đến các cuộc gọi http.ASP.NET MVC khởi tạo Bộ điều khiển và gọi hành động lập trình

của nó giống như những gì xảy ra với thử nghiệm Unit - ví dụ:

var controller = new TestController(); 
var result = controller.Index("TestParameter") as ViewResult; 

Vấn đề là trong ví dụ này bộ điều khiển và hành động là không năng động, không ai biết làm thế nào để khởi tạo một bộ điều khiển và gọi một hành động với tên của bộ điều khiển và hành động như paramater chuỗi? Chẳng hạn như -

public ActionResult run(string controllerName, string actionName) 
{ 
    var controller = new Controller(controllerName); 
    var result = controller.action(actionName).("TestParameter") as ViewResult; 
    return Content(result); 
} 
+0

Mục đích của bộ điều khiển là xử lý các yêu cầu của trình duyệt. Bạn đang gọi một bộ điều khiển MVC từ một lớp khác? – im1dermike

+0

Có, tôi muốn gọi nhiều bộ điều khiển và hành động từ một hành động điều khiển đơn khác như hành động chạy ở trên. – Harleyz

+6

Điều duy nhất cần gọi là bộ điều khiển MVC là trình duyệt. – im1dermike

Trả lời

13

Sử dụng ControllerFactory cùng với ActionDescriptor để tự động thực hiện thao tác:

public ActionResult Run(string controllerName, string actionName) 
{ 
    // get the controller 
    var ctrlFactory = ControllerBuilder.Current.GetControllerFactory(); 
    var ctrl = ctrlFactory.CreateController(this.Request.RequestContext, controllerName) as Controller; 
    var ctrlContext = new ControllerContext(this.Request.RequestContext, ctrl); 
    var ctrlDesc = new ReflectedControllerDescriptor(ctrl.GetType()); 

    // get the action 
    var actionDesc = ctrlDesc.FindAction(ctrlContext, actionName); 

    // execute 
    var result = actionDesc.Execute(ctrlContext, new Dictionary<string, object> 
    { 
     { "parameterName", "TestParameter" } 
    }) as ActionResult; 

    // return the other action result as the current action result 
    return result; 
} 

Xem MSDN

+0

Bạn phải cẩn thận với bất kỳ truy cập HttpContext nào, tuy nhiên .... –

+0

Tôi muốn nói, từ đoạn mã trên, tôi có thể xây dựng chức năng Công việc theo lịch trong ứng dụng của mình và nó đã hoạt động như một sự quyến rũ trong nhiều tháng :) Chúng tôi có thể lên lịch bay bất kỳ hành động nào để chạy theo lịch trình, tôi nghĩ rằng đó không phải là cách MVC được thiết kế, đây là một giải pháp tuyệt vời. Chúc mừng @ haim770! – Harleyz

-3

Tôi không chắc chắn đâu là vấn đề thực sự của bạn nằm — nào bạn muốn để kiểm tra bộ điều khiển/hành động hoặc bạn có muốn kiểm tra chức năng của công việc của mình không?

  1. Nếu bạn cần kiểm tra điều khiển/hành động nó sẽ liên quan đến HttpContext.
  2. Nếu bạn cần kiểm tra chức năng công việc của mình một cách tốt hơn để tách biệt trong lớp dịch vụ/kho lưu trữ của bạn và bạn có thể thực hiện kiểm tra bằng cách sử dụng mẫu kho lưu trữ.
Các vấn đề liên quan