2010-01-13 87 views
21

我有我与Asp.Net期货法的RenderAction使一些局部动作。这些表格中的一些已经处理后执行重定向。现在为什么重定向结果未在儿童操作中允许Asp.net MVC 2

,我升级到Asp.Net MVC 2 RC它给了我一个错误“孩子的行为是不允许进行重定向操作”。

我检查了源代码,我发现,抛出异常的线。为了解决这个问题,我可以创建一个自定义的RedirectResult,但是在我之前,我想了解为什么框架首先不允许它。必须有一个很好的理由,也许我不应该这样做。

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

谢谢

回答

32

限制存在,因为MVC已经开始渲染一个视图到客户端。从这一点重定向的影响是未定义的。它可以很好地工作,它可以继续绘制原观点没有重定向,它可以抛出一个不同的异常等

由于在执行此操作的结果是不确定的,框架阻止它。实际上,出于类似的原因,RenderAction不应该用于呈现除视图之外的其他任何内容(或类似于视图的内容)。

在你的特定情况下,外部动作应该重定向。如果你只是最终从视图中重定向而不向用户展示任何东西,那么首先完全没有意图通过视图,因为外部行为可能已经将工作委托给它的适当位置拥有。

1

在这种情况下,只需在局部视图表单提交的URL,这是你的问题的重定向的目标采取行动,让它执行自身重定向的GET版本。

6

在我的情况下,所呈现的形式是一个扩展到一个网站我建立一个“配置”面板。我希望扩展程序自己的控制器能够处理表单处理,然后重定向回管理页面列出所有配置的扩展。我不认为在这里要求父页面的控制器处理扩展表单是不恰当的或不实际的。你会建议我做什么呢?

+0

这是同样的情况我有。由于我只是在管理页面上使用它来实现可扩展性,我决定将重定向保留在子操作控制器中。我编写了自己的ChildActionRedirectResult,然后创建了一个覆盖重定向方法的ChildActionController库来使用我自己的结果。我不会这样做前端使用。 – Sruly 2010-02-03 12:50:33

+0

我最终只是返回一个简单的查看结果,其中包含“您的更改已保存”消息以及返回管理页面的用于管理扩展的链接。这不是很好,但它的确有窍门。 – 2010-02-05 19:18:11

3

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

ActionResult X 
    Return View 
View X 
    RenderAction Y 

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

我的解决方案。

操作方法:

return View("Redirect", model); 

查看:

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

尝试使用这样的事情在儿童行动:

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

我在一个登录操作中使用了此操作,显示为需要在成功登录时重定向的主页的部分视图 – user1760527 2014-11-29 11:31:15

+0

这实际上会导致客户端浏览器在收到重定向标头后重新请求该页面,但它工作得很好。 – 2017-02-13 03:16:32

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 ..