2012-03-20 3 views
5

Je suis une action ListeMVC3 Pourquoi l'erreur "Les actions enfants ne sont pas autorisées à effectuer des actions de redirection"?

//[HttpGet] (will come back to that!) 
    public ViewResult List(int page = 1) 
    { 
     //blah blah blah 
     return View(viewModel); 
    } 

À son avis, nous rendions l'action:

@{   
    Html.RenderAction("UpdateSearch"); 
} 

définitions d'action:

[ChildActionOnly] 
[HttpGet] 
public PartialViewResult UpdateSearch() 
{ 
    // do something and display a form in view 
    return PartialView(so); 
} 

[HttpPost] 
public RedirectToRouteResult UpdateSearch(Options searchOptions) 
{ 
    // do something and redirect to List 
    return RedirectToAction("List"); 
} 

et je suis en train: les actions de l'enfant ne sont pas autorisés à effectuer une exception d'actions de redirection chaque fois que quelqu'un soumet le formulaire. Je suis nouveau à MVC3, mais il semble que la redirection est également un POST, car si [HttpGet] au-dessus de la méthode List est décommentée, "la ressource ne peut pas être trouvée" se produit. Comment changer la méthode Http lors de la redirection ou suis-je en train de faire quelque chose de mal? J'ai essayé de Bing, mais pas de succès.

Répondre

3

Les informations de redirection sont stockées dans l'en-tête de réponse. Toutefois, la réponse est déjà envoyée lorsque l'action enfant est exécutée afin que les en-têtes ne puissent pas être écrits.

En résumé, il n'existe aucun moyen d'effectuer une redirection à partir d'une action enfant autrement qu'avec l'utilisation de javascript côté client.

+0

Cela aurait du sens, mais la redirection dans mon exemple ne se fait pas par méthode avec les annotations [ChildActionOnly]. Le problème est que lorsque [HttpPost] UpdateSearch redirige vers List, il redirige avec POST, donc [HttpPost] méthode est (essayant d'être) utilisé pour la génération partielle dans la vue. Puis-je utiliser RouteValueDictionary pour le changer? –

+0

Montrez-nous également le contenu de la vue partielle. Le problème réside probablement dans une mauvaise définition d'itinéraire dans BeginForm mais je ne peux pas le dire sans voir la vue. –

+2

Vous avez raison. Pour résoudre ce problème, il suffit d'ajouter le paramètre d'action à la méthode BeginForm en vue UpdateSearch (Get, version enfant) si un changement de: /@ en utilisant (Html.BeginForm()) { à: /@ using (Html.BeginForm ("UpdateSearch")) { a résolu le problème. Es-tu capable d'expliquer pourquoi? –

Questions connexes