2009-09-30 73 views
7

ASP.NET MVC控制器是否可以創建不同控制器的新實例並有效地將責任委派給那個?.NET MVC在另一個控制器內部實例化控制器

比方說,例如,我在/控制器/目錄中的兩個控制器:

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); 
     } 
} 

...和查看稱爲視圖/其它/ ShowNumberOfThings.aspx:

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

當我打的網址:

http://localhost/Home/Index

我想是存在ED與頁面讀取:

「的東西數:100」

我想能夠堅持控制器重定向之間的臨時數據,而無需被迫使用會話對象(TempData的[「」]的用途交叉控制器重定向的會話對象)。我的現實世界的案例有一個複雜的對象需要通過(不只是一個int),所以使用URL/Cookie是不可能的,會話狀態是一個不允許的。

在WebForms中,至少我們可以使用Server.Transfer並在HttpContext.Items集合中維護任何狀態。在MVC中,我可以看到的唯一選擇是直接調用控制器方法傳入必需的參數。

目前它無法解析視圖文件夾,因爲「上下文」仍在HomeController下運行。

我想我要去哪裏試圖將ASP.NET MVC整合爲FrontContoller

任何想法?

編輯

最後,我們不得不一切連載到一個會話並使用它。令人遺憾的是,我聽說MVC2將支持串行化對象到ViewState中。

+0

我已經做了一些非常類似於此的工作正常 - 模型應該正確傳遞,那麼這是什麼問題的上下文? – Keith

回答

2

我認爲這將是首選使用。

return RedirectToAction("Controller", "Action") 

不過我猜你想保持網址首頁/索引。 如果您正在查看FrontController模式,那麼您應該研究編寫一個從DefaultControllerFactory繼承的Custom ControllerFactory,然後重寫CreateController方法。 您可以使用下面的代碼註冊您的工廠。

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

在控制器工廠,你可以訪問的RequestContext使您可以根據需要改變的RouteData並委託到正確的控制器。

你當然可以設置一個自定義的路徑Home/Index到OtherController。ShowNumberOfThings()

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

我無法使用RedirectToAction,因爲這會導致兩個HTTP請求。 在我的情況下,我需要傳遞一個複雜的對象,而不是一個int,所以我不能將它串行化成一個查詢字符串(路由)參數。 雖然很好的答案。 – Codebrain

3

如果你想要呈現與「物聯網數:100」當你打的索引操作,爲什麼不直接呈現相應的視圖:

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

不同的方法是使用的部分景色

,而不是~Views/Other/ShowNumberOfThings.aspx

你可以把你的觀點在~Views/shared/ShowNumberOfThings.ascx

有兩種觀點~Views/Other/ShowNumberOfThings.aspx~Views/Home/Index.aspx實現局部視圖

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

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

,並在兩個視圖實現局部視圖

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

您可以更改int作爲將被傳遞到任何對象模型

0

另一種可能性(類似於部分視圖)是使用Html.RenderAction。這允許不同的視圖模型類和單獨的控制器方法。

<% Html.RenderAction("yourActionName", "yourControllerName", routeValues); %> 
相關問題