";不允许子动作执行重定向动作”;

本文关键字:执行 重定向 quot 不允许 | 更新日期: 2023-09-27 18:20:41

我有这个错误:

执行处理程序"System.Web.Mvc.HttpHandlerUtil+ServerExecuteHttpHandlerAsyncWrapper"的子请求时出错。

内部异常:

不允许子操作执行重定向操作。

知道为什么会发生这种事吗?

顺便说一句,错误发生在这条线上:

@Html.Action("Menu", "Navigation")

导航控制器中的菜单操作如下所示:

public ActionResult Menu()
{
    return PartialView();
}

";不允许子动作执行重定向动作”;

发生这种情况是因为我在控制器上有[RequireHttps],并且从另一个控制器调用了一个子操作。RequireHttps属性导致重定向

这是不允许的,因为MVC已经开始将视图呈现到浏览器(客户端)。因此MVC框架阻止了这一点,因为客户端已经接收到数据(html)。只要渲染正在进行,就无法在子视图中重定向。

您可以返回RedirectToAction

使用@Html而不是@Url

之前:@Html.Action("Menu", "Navigation")

之后:@Url.Action("Menu", "Navigation")

我遇到了和上面描述的Doug一样的情况

我的解决方案:1) 创建了自定义控制器工厂。它需要在我的自定义https属性中获取ControllerContext。

public class CustomControllerFactory : DefaultControllerFactory
    {
        public override IController CreateController(RequestContext requestContext, string controllerName)
        {
            var controller = base.CreateController(requestContext, controllerName);
            HttpContext.Current.Items["controllerInstance"] = controller;
            return controller;
        }
    }
}

2) 在Global.asax的Application_Start函数中,下一个文件写道:

ControllerBuilder.Current.SetControllerFactory(new CustomControllerFactory());

3) 定义的自定义https属性:

public class CustomRequireHttpsAttribute : System.Web.Mvc.RequireHttpsAttribute
    {
        public bool RequireSecure = false;
        public override void OnAuthorization(System.Web.Mvc.AuthorizationContext filterContext)
        {
            if (RequireSecure && !((Controller)HttpContext.Current.Items["controllerInstance"]).ControllerContext.IsChildAction)
            {
                base.OnAuthorization(filterContext);
            }
        }        
    } 

4) 使用新属性定义帐户控制器:[CustomRequireHttps]

像这样重定向

string returnUrl = Request.UrlReferrer.AbsoluteUri;
return Redirect(returnUrl);

而不是

return redirect("Action","Controller")

如果在控制器中添加了[NoDirectAccess]注释,请删除该注释。

以及在局部视图的控制器中

return PartialView()而不是return View()

这发生在Html.Action调用的Action执行重定向(如)的情况下

return RedirectToAction("Error", "Home");

而不是返回所需的partialView

因此,解决方案是删除重定向。