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



asp.net-mvc asp.net-mvc-2 (5)

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

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

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

有谁知道这个限制的原因?

谢谢

https://ffff65535.com


在我不寻常的情况下,我有一个自定义的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 ..

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


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

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

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


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

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

我的解决方案

行动方式:

return View("Redirect", model);

视图:

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




theory