";不允许子动作执行重定向动作”;
本文关键字:执行 重定向 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
因此,解决方案是删除重定向。