为什么不允许在Asp.net MVC 2中的子操作中使用redirect结果

我使用Asp.Net Futures RenderAction方法进行了部分操作。 其中一些执行redirect之后,其中的表格已被处理。

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

我检查了源代码,并发现引发exception的行。 为了解决这个问题,我可以做一个自定义的RedirectResult,但是在我之前我想了解为什么框架不允许它摆在首位。 必须有一个很好的理由,也许我不应该这样做。

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

谢谢

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

由于执行此操作的结果是未定义的,框架会阻止它。 在实践中,出于类似的原因,RenderAction不应该被用来渲染视图以外的东西(或者类似于视图的内容)。

在你的特定情况下,外部行为应该redirect。 如果你只是最终从视图中redirect而不向用户展示任何内容,那么首先完全没有意图去查看视图,因为外部行为可能已经将其工作拥有。

尝试在Child Action中使用像这样的东西:

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

我的解决scheme

操作方法:

 return View("Redirect", model); 

视图:

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

就我而言,呈现的表单是我正在构build的网站的扩展中的“configuration”面板。 我希望扩展自己的控制器能够处理表单处理,然后redirect到pipe理页面列出所有configuration的扩展。 我不认为在这里要求父页面的控制器处理扩展的表单是不合适的或不实际的。 你会build议我做什么呢?

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

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

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

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

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

在这种情况下,只需将部分视图表单的提交url指向作为有问题redirect目标的操作,并让它执行自身redirect到其GET版本。