No hay una solución simple y elegante al Redirectproblema en ASP.Net WebForms. Puede elegir entre la solución sucia y la solución tediosa
Sucio : Response.Redirect(url)envía una redirección al navegador y luego lanza una ThreadAbortedExceptionpara terminar el hilo actual. Por lo tanto, no se ejecuta ningún código más allá de la llamada Redirect (). Desventajas: es una mala práctica y tiene implicaciones de rendimiento para matar hilos como este. Además, ThreadAbortedExceptionsaparecerá en el registro de excepciones.
Tedioso : la forma recomendada es llamar Response.Redirect(url, false)y, sin Context.ApplicationInstance.CompleteRequest()embargo, la ejecución del código continuará y el resto de los controladores de eventos en el ciclo de vida de la página aún se ejecutarán. (Por ejemplo, si realiza la redirección en Page_Load, no solo se ejecutará el resto del controlador, Page_PreRender, etc., sino que también se invocará: la página representada simplemente no se enviará al navegador. Puede evitar el procesamiento adicional al por ejemplo, establecer un indicador en la página y luego permitir que los controladores de eventos posteriores verifiquen este indicador antes de realizar cualquier procesamiento.
(La documentación CompleteRequestindica que "hace que ASP.NET omita todos los eventos y el filtrado en la cadena de ejecución de la canalización HTTP ". Esto puede ser fácilmente malinterpretado. Omite más filtros y módulos HTTP, pero no omite más eventos en el ciclo de vida actual de la página ).
El problema más profundo es que WebForms carece de un nivel de abstracción. Cuando está en un controlador de eventos, ya está en el proceso de crear una página para la salida. La redirección en un controlador de eventos es fea porque está finalizando una página parcialmente generada para generar una página diferente. MVC no tiene este problema, ya que el flujo de control es independiente de las vistas de representación, por lo que puede hacer una redirección limpia simplemente devolviendo un RedirectActionen el controlador, sin generar una vista.
Context.ApplicationInstance.CompleteRequest();. ¿Por qué? ¿Tendré que hacerloreturndesde el controlador de eventos condicionalmente?