为什么在Asp.net MVC 2中的子操作中不允许重定向结果

时间:2010-01-13 12:04:02

标签: asp.net-mvc asp.net-mvc-2 theory

我有一些使用Asp.Net Futures RenderAction方法渲染的部分动作。其中一些在处理完表单后执行重定向。

现在我升级到Asp.Net MVC 2 RC它给我一个错误“不允许子操作执行重定向操作”。

我检查了源代码,然后找到了抛出异常的行。为了解决这个问题,我可以制作一个自定义的RedirectResult,但在此之前,我想了解为什么框架首先不允许它。必须有一个很好的理由,也许我不应该这样做。

任何人都知道这种限制的原因吗?

由于

7 个答案:

答案 0 :(得分:35)

存在限制是因为MVC已经开始向客户端呈现视图。从这一点重定向的影响是不确定的。它可以完美地工作,它可以继续呈现原始视图而无需重定向,它可能会抛出不同的异常,等等。

由于执行此操作的结果未定义,因此框架会阻止它。实际上,出于类似的原因,RenderAction决不应该用于渲染除视图(或类视图内容)之外的任何内容。

在您的特定情况下,外部操作应该重定向。如果你最终还是要从视图中重定向而不向用户显示任何内容,那么首先没有目的通过视图,因为外部动作可能已经适当地委托了它的工作自己的。

答案 1 :(得分:17)

尝试在Child Action中使用类似的东西:

ControllerContext.HttpContext.Response.Redirect(ControllerContext.HttpContext.Request.Url.ToString());

答案 2 :(得分:13)

我的解决方案。

行动方法:

return View("Redirect", model);

查看:

<script type="text/javascript" language="javascript">
    document.location = '<%: Url.Action("Index", "Album", new { id = Model.Id }) %>';</script>

答案 3 :(得分:6)

在我的情况下,正在呈现的表单是我正在构建的网站的扩展上的“配置”面板。我希望扩展程序自己的控制器能够处理表单处理,然后重定向回列出所有已配置扩展的管理页面。我不认为让父页面的控制器处理扩展表单是合适的或实际的。你会建议我做什么呢?

答案 4 :(得分:5)

在我不寻常的情况下,我有一个自定义的AuthorizeAttribute附加到我的控制器,它试图重定向子动作,这是(如上所述)不允许的。

要解决此问题,我删除了所有子操作的授权检查重定向:

Public Overrides Sub OnAuthorization(filterContext As AuthorizationContext)
    //Child actions cannot redirect anyway, so no need to check permissions.
    If filterContext.IsChildAction Then Exit Sub

    .. parent authorisation checks ..

答案 5 :(得分:3)

有时,当您尝试呈现基本操作结果的操作时会发生此错误。 例如:

ActionResult X
    Return View
View X
    RenderAction Y

ActionResult Y
    // Bla bla
       return View 
    // else
       return RedirectToAction X

答案 6 :(得分:1)

在这种情况下,只需将部分视图表单的提交URL指向有问题的重定向目标的操作,并让它自己重定向到其GET版本。