我有一个动作方法,根据传递给它的内容,我想重定向到另一个控制器中的另一个动作。操作和控制器名称在运行时确定。
如果我返回RedirectToAction(),它将强制重定向并更改浏览器中的URL。我想要的是像TransferToAction()那样可以将当前请求的处理转移到另一个动作,而不进行重定向。我似乎记得在早期的预览中表现得像这样的方法,但我似乎无法在ASP.NET MVC的RC中找到它。
你知道我会怎么做吗?
更新
我添加了以下路线:
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中设置控制器和操作,以便呈现Home Index视图。否则,它将在PageRouterController中查找索引视图。
我仍然需要弄清楚如何创建一个控制器及其动作只知道他们的名字。例如我希望能够打出这样的话:
public ActionResult RoutePage(string site, string url)
{
return InvokeAction("Home", "Index");
}
InvokeAction()应该包含哪些内容?我是否需要在任何情况下传递它?
答案 0 :(得分:4)
你应该能够直接调用另一个方法,假设它返回一个ViewResult,它将呈现该视图以响应请求,并且url不会改变。请注意,您将负责确保其他方法所需的所有数据都可用。例如,如果您的其他方法需要一些未提供的表单参数,则可能需要构造一个合适的FormCollection,并根据您的FormCollection将控制器的ValueProvider设置为ValueProvider。与方法所需的任何参数一样。