“不允许子操作执行重定向操作”

时间:2012-01-19 10:31:27

标签: c# asp.net-mvc-3

我有这个错误:

  

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

内部异常:

  

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

知道为什么会这样吗?

顺便提一下,错误发生在这一行:

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

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

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

7 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分:5)

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

您可以返回RedirectToAction

答案 2 :(得分:5)

而不是

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

使用

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

为我工作:)

答案 3 :(得分:1)

  

我和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]

答案 4 :(得分:0)

这样重定向

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

代替

return redirect("Action","Controller")

答案 5 :(得分:0)

删除[NoDirectAccess]批注(如果已添加到控制器中)。

和控制器中的部分视图

返回PartialView()而不是返回View()

答案 6 :(得分:0)

这种情况发生在 Html.Action 调用的 Action 执行重定向的情况下,例如

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

而不是返回所需的 partialView

所以解决方案是删除重定向。