假设要求是在 ASP.NET MVC Controller 中成功保存模型后重定向到另一个页面:
[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);
}
除非 Controller 被渲染为子 Action ,否则这会正常工作:
@{
Layout = "my layout";
Html.RenderAction("something else, a view for example");
Html.RenderAction("Index action of the above controller"); // <----
}
在这种情况下,RedirectResult 类将检查并查看上下文是否为子操作,并将抛出异常:“不允许子操作执行重定向操作”。
我知道写入响应流已经在进行中,并且此处无法进行重定向,但尽管如此,在 Controller 中的服务器端操作之后,即使该操作是子操作,也必须能够重定向到其他页面。我们使用 Layouts 和 RenderActions 来重用页面设计的共享部分。
如何在这样的 Controller 中实现这样的重定向?
编辑:
主要目标是重用执行特定工作的 View / Controller ,并将它们拆分为逻辑概念,例如显示一些数据或提供编辑表单。我的方法是使用 RenderAction 将结果渲染到容器中。容器 View (主页的索引操作)充当传统的 asp.net 页面,其布局 View 作为母版页,编辑和 View Controller / View 相当于用户控件(模块)。问题是在写入内容后无法重定向响应:
最佳答案
我将提交一个新答案,以保持事情干净。
正常的 mvc 流程是这样的:
Http 命令到达 1 个 Controller ,该 Controller 充当唱诗类指挥(又名 Controller )并调用多个逻辑容器(例如服务/命令处理程序):
public ActionResult Index(){
var data = _yourService.FetchData();
return View(data);
}
此 Controller 渲染 1 个 View ,该 View 可以有多个部分
@{
Layout = "my layout";
}
<p>Some html</p>
Html.RenderPartial("A shared partial");
Html.RenderPartial("shared\yourUserControl", Model.PropertyOrSomething);
如果部分包含太多逻辑而无法生成,您可以添加 RenderAction 或创建 htmlHelper 扩展。
但是这些都不应该能够控制您的请求的流程,在我看来,保存或可以重定向的内容永远不应该从 View 内部调用。
我假设您非常想重用 Controller 中的代码,因为它变得相当大。
我的建议是通过向上委派尽可能多的逻辑来尝试尽可能地清除该 Controller 。
只需查看 Controller 方法 5 秒钟,您就应该了解此操作将执行什么操作,如果情况并非如此:重构它! :)
关于asp.net-mvc - 在部分 View 中保存后重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19000030/