假设要求是在 ASP.NET MVC 控制器中成功保存模型后重定向到另一个页面:
[HttpPost]
public ActionResult Index(ViewModel viewModel)
{
if (ModelState.IsValid)
{
// Do save;
return RedirectToAction("whatever"); // <--- here's the problem
}
// display validation errors and so
return View(viewModel);
}
除非控制器被呈现为子动作,否则这将正常工作:
@{
Layout = "my layout";
Html.RenderAction("something else, a view for example");
Html.RenderAction("Index action of the above controller"); // <----
}
在这种情况下,RedirectResult 类将检查并查看上下文是否为子操作,并会抛出异常:“不允许子操作执行重定向操作”。
我知道写入响应流已经在进行中,并且无法在此处进行重定向,但是即使该操作是子操作,也必须能够在控制器中的服务器端操作之后重定向到其他页面。我们使用 Layouts 和 RenderActions 来重用页面设计的共享部分。
你将如何在这样的控制器中实现这样的重定向?
编辑:
主要目标是重用执行特定工作的视图/控制器,并将它们拆分为逻辑概念,例如显示一些数据或提供编辑表单。我的方法是使用 RenderAction 将它们的结果呈现到容器中。容器视图(主页的索引操作)充当传统的 asp.net 页面,其布局视图作为母版页,编辑和视图控制器/视图等效于用户控件(模块)。问题是在写入内容后无法重定向响应: