Il n'y a pas de solution simple et élégante au Redirect
problème dans ASP.Net WebForms. Vous pouvez choisir entre la solution Dirty et la solution Tedious
Dirty : Response.Redirect(url)
envoie une redirection vers le navigateur, puis lance un ThreadAbortedException
pour terminer le thread actuel. Donc, aucun code n'est exécuté après l'appel Redirect (). Inconvénients: c'est une mauvaise pratique et avoir des implications sur les performances de tuer des threads comme celui-ci. En outre, ThreadAbortedExceptions
apparaîtra dans la journalisation des exceptions.
Fastidieux : la méthode recommandée consiste à appeler Response.Redirect(url, false)
puis à Context.ApplicationInstance.CompleteRequest()
exécuter. Cependant, l'exécution du code se poursuivra et le reste des gestionnaires d'événements du cycle de vie de la page sera toujours exécuté. (Par exemple, si vous effectuez la redirection dans▶ Load, non seulement le reste du gestionnaire sera exécuté, également la fonction PrendPenderRender, etc. sera également appelée - la page rendue ne sera simplement pas envoyée au navigateur. Vous pouvez éviter le traitement supplémentaire Par exemple, définir un indicateur sur la page, puis laisser les gestionnaires d'événements suivants vérifier cet indicateur avant de procéder à tout traitement.
(La documentation CompleteRequest
indique qu'il " oblige ASP.NET à contourner tous les événements et le filtrage dans la chaîne d'exécution du pipeline HTTP ". Cela peut facilement être mal compris. Il contourne d'autres filtres et modules HTTP, mais il ne contourne pas d'autres événements dans le cycle de vie de la page en cours .)
Le problème le plus profond est que WebForms n'a pas un niveau d'abstraction. Lorsque vous êtes dans un gestionnaire d'événements, vous êtes déjà en train de créer une page à afficher. La redirection dans un gestionnaire d'événements est moche car vous terminez une page partiellement générée afin de générer une page différente. MVC n'a pas ce problème car le flux de contrôle est distinct des vues de rendu, vous pouvez donc effectuer une redirection propre en renvoyant simplement un RedirectAction
dans le contrôleur, sans générer de vue.
Context.ApplicationInstance.CompleteRequest();
. Pourquoi? Dois-jereturn
le soumettre au gestionnaire d'événements de manière conditionnelle?