2012-01-19 30 views
8

que tienen este error:"acciones secundarias no se les permite llevar a cabo acciones redirigir"

Error executing child request for handler 'System.Web.Mvc.HttpHandlerUtil+ServerExecuteHttpHandlerAsyncWrapper'.

con excepción interna:

Child actions are not allowed to perform redirect actions.

Cualquier idea de por qué sucede esto?

Por cierto, el error está ocurriendo en esta línea:

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

la acción del menú en el regulador de la navegación se ve así:

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

Usted puede mirar esta pregunta http://stackoverflow.com/questions/2056421/why-are-redirect-results-not -allow-in-child-actions-in-asp-net-mvc-2 – Tassadaque

+6

¿Cuántas veces tiene la intención de preguntar esto hoy? Posible duplicado de [Error al ejecutar la solicitud secundaria para controlador] (http://stackoverflow.com/questions/8924177/error-executing-child-request-for-handler) –

Respuesta

5

Esto no está permitido porque MVC ya ha comenzado representación del Ver al navegador (cliente). Entonces MVC Frameworks lo bloquea porque el cliente ya recibe datos (html). Siempre que la representación esté en curso, no podrá redirigir en su vista secundaria.

Puede devolver RedirectToAction en su lugar.

+5

'¿Puede devolver RedirectToAction en su lugar? confuso .. – dotNETbeginner

+0

Intenté tantas soluciones para obtener un filtro de autenticación personalizado funcionando y finalmente descubrí que mi vista llamaba '@ Html.Action()' en lugar de '@ Url.Action()' este último le da una url para un enlace y el primero ejecuta una acción del controlador que muestra su vista en su lugar. Muy frustrante, asegúrate de no cometer este error –

+0

Estoy usando RedirectToAction en mi controlador, pero aún así me da el error – Denny

9

Esto me sucedió porque tenía [RequireHttps] en el controlador y se llamó a una acción secundaria desde un controlador diferente. El atributo RequireHttps causó la redirección

1

I had same situation like Doug described above

Mi solución: 1) Creado encargo Controlador de fábrica. Es necesario obtener ControllerContext en mi atributo https personalizado.

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) En función de Application_Start de archivo Global.asax escribió después:

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

3) https personalizados definidos atribuyen:

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) Uso de nuevo atributo para la definición de la cuenta controlador: [CustomRequireHttps]

5

lugar o f

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

Uso

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

trabajado para mí :)

Cuestiones relacionadas