2009-02-12 85 views
3

我有一個操作方法,並且根據傳遞給它的內容,我想重定向到另一個控制器中的另一個操作。操作和控制器名稱在運行時確定。在ASP.NET MVC中,當返回RedirectToAction時保留URL

如果我返回RedirectToAction(),它將強制重定向並更改瀏覽器中的URL。我想要的就是TransferToAction(),它可以將當前請求的處理轉移到另一個動作,而不用做重定向。我似乎記得早些預覽中的一種方法,但我似乎無法在ASP.NET MVC的RC中找到它。

你知道我該怎麼做嗎?

UPDATE

我增加了以下路線:

routes.MapRoute(
    "PageRouter", 
    "{site}/{*url}", 
    new { controller = "PageRouter", 
      action = "RoutePage", site = "", url = "" } 
); 

而且PageRouter控制器動作RoutePage:

public ActionResult RoutePage(string site, string url) 
{ 
    var controller = new HomeController {ControllerContext = ControllerContext}; 
    controller.RouteData.Values["controller"] = "Home"; 
    controller.RouteData.Values["action"] = "Index"; 

    return controller.Index(site, url); 
} 

我不得不設置的RouteData控制器和行動的主頁索引要呈現的視圖。否則,它會在PageRouterController中尋找一個Index視圖。

我仍然需要弄清楚如何創建一個只知道他們名字的控制器及其動作。例如我想能夠這樣調用像這樣的:

public ActionResult RoutePage(string site, string url) 
{ 
    return InvokeAction("Home", "Index"); 
} 

InvokeAction()應該怎麼辦?我需要將它傳遞給任何上下文嗎?

回答

4

您應該可以直接調用另一個方法,並假設它返回一個ViewResult,它將呈現該視圖以響應請求,並且url不會更改。請注意,您將負責確保其他方法所需的所有數據都可用。例如,如果您的其他方法需要某些未提供的表單參數,則可能需要構造一個合適的FormCollection,並根據您的FormCollection將該控制器的ValueProvider設置爲ValueProvider。同樣,該方法需要任何參數。

+0

所以我將不得不使用反射來調用操作方法?我不知道我要重定向到的行動或控制器的名稱,直到運行時間。 – 2009-02-12 23:43:21