2009-02-12 81 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