RedirectToAction()之后页面中的Html.RenderAction失败

时间:2014-01-21 10:31:48

标签: asp.net-mvc-4

我有一个页面“ViewUser”。这种结构

//display something about the user
@{Html.RenderAction("UpdateUser", new { UserId = @Model.UserId });}
//display some more stuff

在UpdateUser的控制器方法中我有

public ActionResult UpdateUser(int UserId){//populate form vars
[HttpPost]
public ActionResult UpdateUser(User u)//
// code to update the user
return RedirectToAction("ViewUser", new { User = u.UserId });

当我打开页面时,它工作正常我在UpdateUser表单中看到了我的用户数据和日期。 但是,当我更新用户数据并从UpdateUser重定向到ViewUser页面时,我得到了 “不允许子操作执行重定向操作。”

但再次手动打开页面会显示更新成功。 据我所知,浏览器应该为所有内容执行新的GET,所以我不明白为什么它适用于手动刷新,但不是在UpdateUser返回重定向时?

1 个答案:

答案 0 :(得分:3)

错误很明显:

Child actions are not allowed to perform redirect actions.

当你直接调用一个动作(而不是一个子动作)时,它负责决定它返回浏览器的内容。因此它可以决定返回重定向。

但是,如果将此操作作为子操作调用,则已经有一个主要操作已决定返回到浏览器的内容,并且要求此子操作呈现其他HTML。因此,如果子操作返回不同的内容,则作为重定向,它将失败。

请参阅此ChildActionExtensions.RenderAction Method

  

调用子操作方法并在父视图中以内联方式呈现结果。

无法在父视图中呈现重定向或非HTML(视图/部分视图结果)的任何内容。

您可以在子动作中模拟“重定向”,包括重定向页面的脚本,通过在其上包含此JavaScript(How can I make a redirect page in jQuery/JavaScript?):

window.location.replace('@Url.Action(...)');

无论如何,您宁愿从主视图中执行此操作,方法是使用您在partial上使用的相同逻辑来决定进行重定向。