Pourquoi les résultats de redirection ne sont-ils pas autorisés dans les Actions enfants Asp.net MVC 2
J'ai quelques actions partielles que je rends avec le Asp.Net méthode de rendu à terme. Certains d'entre eux effectuent des redirections après que les formulaires qu'ils contiennent ont été traités.
Maintenant que j'ai mis à niveau vers Asp.Net MVC 2 RC il me donne une erreur "les actions enfants ne sont pas autorisées à effectuer des actions de redirection".
J'ai vérifié le code source et j'ai trouvé la ligne qui lève l'exception. Pour le contourner, je peux faire un RedirectResult personnalisé, mais avant de le faire, je veux comprendre pourquoi le framework ne le permet pas en premier lieu. Il doit y avoir une bonne raison et peut-être que je ne devrais pas faire non plus.
Quelqu'un connaît la raison de cette limitation?
Merci
7 réponses
La limitation existe car MVC a déjà commencé à rendre une vue au client. L'effet de la redirection à partir de ce point n'est pas défini. Cela pourrait fonctionner parfaitement, il pourrait continuer à rendre la vue d'origine sans rediriger, il pourrait lancer une exception différente, etc.
Puisque le résultat de l'exécution de cette action n'est pas défini, le cadre bloque. En pratique, RenderAction ne doit jamais être utilisé pour rendre autre chose qu'une vue (ou un contenu de type vue) pour des raisons.
Dans votre cas particulier, l'action externe doit rediriger. Si vous finissez par rediriger de toute façon depuis la vue sans rien montrer à l'utilisateur, il n'y avait vraiment aucun but de parcourir la vue en premier lieu, car l'action externe aurait pu déléguer le travail de manière appropriée.
Essayez d'utiliser quelque chose comme ceci dans l'Action Enfant:
ControllerContext.HttpContext.Response.Redirect(ControllerContext.HttpContext.Request.Url.ToString());
Ma solution.
Méthode d'Action:
return View("Redirect", model);
Vue:
<script type="text/javascript" language="javascript">
document.location = '<%: Url.Action("Index", "Album", new { id = Model.Id }) %>';</script>
Dans mon cas, le formulaire en cours de rendu est un panneau "configurer" sur une extension d'un site Web que je construis. Je voudrais que le propre contrôleur de l'extension puisse gérer le traitement du formulaire, puis rediriger vers la page d'administration listant toutes les extensions configurées. Je ne pense pas qu'il soit approprié ou pratique ici de demander au contrôleur de la page parent de traiter le formulaire pour l'extension. Que suggérerais-tu que je fasse à la place?
Dans mon cas inhabituel, j'avais un AuthorizeAttribute personnalisé attaché à mes contrôleurs qui tentait de rediriger sur une action enfant, ce qui n'est pas autorisé (comme mentionné ci-dessus).
Pour résoudre le problème, j'ai supprimé la redirection de vérification d'autorisation sur toutes les actions enfants:
Public Overrides Sub OnAuthorization(filterContext As AuthorizationContext)
//Child actions cannot redirect anyway, so no need to check permissions.
If filterContext.IsChildAction Then Exit Sub
.. parent authorisation checks ..
Parfois, cette erreur s'est produite lorsque vous essayez de rendre une action du résultat de l'action de base. Exemple:
ActionResult X
Return View
View X
RenderAction Y
ActionResult Y
// Bla bla
return View
// else
return RedirectToAction X
Dans ce cas, pointez simplement l'url de soumission du formulaire de vue partielle vers l'action qui était la cible de votre redirection problématique et laissez-la Effectuer elle-même la redirection vers sa version GET.