2012-01-19 12 views
8

mam ten błąd:„Działania dzieci nie mogą wykonywać przekierowanie działania”

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

z wewnętrznym wyjątek:

Child actions are not allowed to perform redirect actions.

jakiś pomysł, dlaczego tak się dzieje?

Nawiasem mówiąc, błąd dzieje się na tej linii:

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

menu Akcja w kontroler nawigacji wygląda następująco:

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

Można spojrzeć na to pytanie http://stackoverflow.com/questions/2056421/why-are-redirect-results-not -alokowane-w-dzieci-akcje-w-asp-net-mvc-2 – Tassadaque

+6

Ile razy masz zamiar spytać o to dzisiaj? Możliwy duplikat [Błąd wykonywania żądania podrzędnego dla handler'a] (http://stackoverflow.com/questions/8924177/error-executing-child-request-for-handler) –

Odpowiedz

5

To nie jest dozwolone, ponieważ MVC rozpoczęła już renderowania Wyświetl do przeglądarki (klienta). Więc MVC Frameworks blokuje to, ponieważ klient już otrzymuje dane (html). Tak długo, jak renderowanie jest w toku, nie można przekierować w widoku podrzędnym.

Zamiast tego możesz zwrócić RedirectToAction.

+5

'Zamiast tego możesz zwrócić RedirectToAction' ?? mylące .. – dotNETbeginner

+0

Próbowałem tak wiele rozwiązań, aby uzyskać niestandardowy filtr autoryzacji działa i wreszcie zorientowałem się, że mój widok był wywołanie '@ Html.Action()' zamiast '@ Url.Action()' ten ostatni daje adres URL dla łącze i pierwszy wykonuje działanie kontrolera, wyświetlając jego widok. Bardzo frustrujące, upewnij się, że nie popełniasz tego błędu –

+0

Używam RedirectToAction w moim kontrolerze, ale nadal daje mi błąd – Denny

9

Stało się tak, ponieważ miałem [RequireHttps] na kontrolerze, a akcja podrzędna została wywołana z innego kontrolera. Atrybut RequireHttps spowodowało przekierowanie

1

I had same situation like Doug described above

Moje rozwiązanie: 1) utworzona niestandardową Controller Factory. Potrzebuję uzyskać ControllerContext w moim niestandardowym atrybucie https.

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) W zależności od pliku Global.asax Application_Start pisał dalej:

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

3) Definicje atrybutów niestandardowych 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) Stosując nowy atrybut do definicji rachunku kontroler: [CustomRequireHttps]

5

Zamiast o f

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

Zastosowanie

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

pracował dla mnie :)

Powiązane problemy