2009-09-30 58 views
7

Có thể cho bộ điều khiển ASP.NET MVC để tạo một thể hiện mới của bộ điều khiển khác và ủy quyền có hiệu quả đối với điều khiển đó không?Bộ điều khiển khởi tạo .NET MVC bên trong bộ điều khiển khác

Hãy nói ví dụ mà tôi có hai bộ điều khiển trong thư mục/Bộ xử lý/thư mục:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
      var otherController = new OtherController(); 
      return otherController.ShowNumberOfThings(100); 
    } 
} 

public class OtherController : Controller 
{ 
     public ActionResult ShowNumberOfThings(int index) 
     { 
      return View(index); 
     } 
} 

... và một Xem gọi Views/Khác/ShowNumberOfThings.aspx:

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="ViewPage<int>" %> 
Number of things: <%= Model.ToString() %> 

Khi tôi nhấn url:

http://localhost/Home/Index

tôi muốn có mặt ed với một trang mà đọc:

"Số thứ: 100"

Tôi muốn để có thể tồn tại dữ liệu tạm thời giữa chuyển hướng điều khiển mà không bị buộc phải sử dụng các đối tượng session (TempData [ ""] sử dụng đối tượng phiên cho chuyển hướng bộ điều khiển chéo). Trường hợp thế giới thực của tôi có một đối tượng phức tạp mà cần phải vượt qua (không chỉ là một int) để sử dụng một URL/Cookie là ra khỏi câu hỏi, và trạng thái phiên là một no-no.

Trong WebForms ít nhất chúng ta có thể sử dụng Server.Transfer và duy trì bất kỳ trạng thái nào trong bộ sưu tập HttpContext.Items. Trong MVC, tùy chọn duy nhất tôi có thể thấy là gọi phương thức điều khiển trực tiếp truyền vào các đối số được yêu cầu.

Hiện tại, có sự cố khi cố giải quyết thư mục chế độ xem vì "ngữ cảnh" vẫn đang chạy trong HomeController.

Tôi đoán nơi tôi đang đi với điều này là cố gắng để cludge ASP.NET MVC vào hành động như một FrontContoller.

Bất kỳ ý tưởng nào?

EDIT

Cuối cùng chúng tôi phải serialise tất cả mọi thứ vào một phiên làm việc và sử dụng đó. Một sự xấu hổ, nhưng tôi đã nghe nói rằng MVC2 sẽ hỗ trợ các đối tượng serialising vào ViewState.

+0

Tôi đã làm điều gì đó rất giống với điều này đã hoạt động tốt - mô hình phải được chuyển chính xác, vì vậy điều gì về bối cảnh đó là vấn đề? – Keith

Trả lời

2

Tôi nghĩ rằng nó sẽ được ưa thích hơn để sử dụng.

return RedirectToAction("Controller", "Action") 

Tuy nhiên, tôi đoán bạn muốn duy trì Trang chủ/Chỉ mục URL. Nếu bạn đang tìm kiếm mẫu FrontController thì bạn nên điều tra viết một Custom ControllerFactory mà kế thừa từ DefaultControllerFactory sau đó ghi đè lên phương thức CreateController. Bạn có thể đăng ký nhà máy của mình bằng cách sử dụng mã bên dưới.

protected void Application_Start() 
    { 
     ControllerBuilder.Current.SetControllerFactory(new MyCustomControllerFactory(); 
     RegisterRoutes(RouteTable.Routes); 
    } 

Trong nhà máy điều khiển bạn có quyền truy cập vào các RequestContext vì vậy bạn có thể thay đổi RouteData khi cần thiết và đại biểu đến bộ điều khiển chính xác.

Bạn có thể chỉ cần đặt tuyến Tùy chỉnh cho Trang chủ/Chỉ mục đi đến OtherController.ShowNumberOfThings()

routes.MapRoute("Home", "Home/Index/{id}", 
          new {controller = "Other", action = "ShowNumberOfThings", id = 100}); 
+1

Tôi không thể sử dụng RedirectToAction vì điều này dẫn đến hai yêu cầu HTTP. Trong trường hợp của tôi, tôi cần phải vượt qua một đối tượng phức tạp, không phải là một int, vì vậy tôi có thể không thực sự nối tiếp nó vào một tham số chuỗi truy vấn (route). Câu trả lời hay. – Codebrain

3

Nếu bạn muốn được trình bày với "Số thứ: 100" khi bạn nhấn action Index tại sao không trực tiếp làm cho cái nhìn tương ứng:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     return View("~Views/Other/ShowNumberOfThings.aspx", 100); 
    } 
} 
1

một cách tiếp cận khác nhau sẽ việc sử dụng các quang cảnh một phần

thay vì ~Views/Other/ShowNumberOfThings.aspx

bạn có thể đặt quan điểm của mình trong ~Views/shared/ShowNumberOfThings.ascx

có cả hai quan điểm ~Views/Other/ShowNumberOfThings.aspx~Views/Home/Index.aspx thực hiện xem một phần

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
      return View(100); 
    } 
} 

public class OtherController : Controller 
{ 
     public ActionResult ShowNumberOfThings(int index) 
     { 
      return View(index); 
     } 
} 

và trong cả hai quan điểm thực hiện xem một phần

<% Html.RenderPartial("~Views/shared/ShowNumberOfThings.ascx", ViewData.Model); %> 

bạn có thể thay đổi int cho bất kỳ đối tượng đó sẽ được chuyển đến các model

0

Một khả năng khác (tương tự như một phần lượt xem) là sử dụng Html.RenderAction. Điều này cho phép các lớp mô hình khung nhìn khác nhau và các phương thức điều khiển riêng biệt.

<% Html.RenderAction("yourActionName", "yourControllerName", routeValues); %> 
Các vấn đề liên quan