【问题标题】:Why are Redirect Results not allowed in Child Actions in Asp.net MVC 2为什么在 Asp.net MVC 2 的子操作中不允许重定向结果
【发布时间】:2010-01-13 12:04:01
【问题描述】:

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

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

我检查了源代码并找到了引发异常的行。为了绕过它,我可以制作一个自定义的 RedirectResult,但在此之前,我想了解为什么框架首先不允许它。一定有充分的理由,也许我也不应该这样做。

有人知道这个限制的原因吗?

谢谢

【问题讨论】:

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


    【解决方案1】:

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

    由于执行此操作的结果未定义,因此框架会阻止它。在实践中,出于类似原因,绝不能使用 RenderAction 来渲染视图(或类似视图的内容)以外的任何内容。

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 我在登录操作中使用了它,显示为主页的部分视图,需要在成功登录时重定向
      • 这实际上会导致客户端浏览器在收到重定向标头后重新请求页面,但效果很好。
      【解决方案3】:

      我的解决方案。

      动作方法:

      return View("Redirect", model);
      

      查看:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 这与我的情况相同。由于我只在管理页面上使用它以实现可扩展性,因此我决定将重定向保留在子操作控制器中。我编写了自己的 ChildActionRedirectResult,然后创建了一个 ChildActionController 基础,它覆盖了 Redirect 方法以使用我自己的结果。我不会为前端使用这样做。
        • 我最终只返回了一个简单的视图结果,其中包含“您的更改已保存”消息和返回到管理扩展的管理页面的链接。它不那么漂亮,但它成功了。
        【解决方案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 ..
        

        【讨论】:

          【解决方案6】:

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

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

          【讨论】:

            【解决方案7】:

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2011-08-04
              • 2020-05-17
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多