asp.net-mvc - 在部分 View 中保存后重定向

标签 asp.net-mvc

假设要求是在 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 Redirect after save problem

最佳答案

我将提交一个新答案,以保持事情干净。
正常的 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/

相关文章:

c# - EF 不断尝试保留无效对象

asp.net-mvc - 是否应该始终在模型级别强制执行验证规则?

c# - MVC 路由 : How to map two names to one action

asp.net - 如何从url中删除returnurl?

c# - 如何将 DataAnnotations ErrorMessageResourceName 与自定义资源解决方案一起使用

javascript - 使用 ASP.NET 开发服务器渲染 Angular JS 部分 View

asp.net-mvc - Paypal 结帐页面不显示运费/邮费

c# - MVC 重定向到不同命名空间但同一项目中的另一个 Controller

mysql - 数据表传输到模型,然后传输到 View

asp.net-mvc - ASP.NET MVC 4 拦截所有传入请求