jueves, 3 de septiembre de 2009

Como evitar el doble Postback

Cuanta veces nos ha ocurrido que en una pagina aspx, sencilla de un matenimiento simple con un boton guardar, cuando pulsamos sobre el se ejecuta el evento y el postback pero, que pasa si


despues de ello al usuario se le ocurre refrescar la pagina desde el navegador o hacer F5, ocurre



algo inesperado pues al hacer nuevamente el postback el evento del boton se vuelve a ejecutar y es como que si ubiesemos hecho click nuevamente. esto causaria molestias al usuario pues no deberia suceder.



asi que voy a postear una forma practica de como solucionarlo




primero tienen que crear una clase donde implementemos el IHttpModule y controlarlo mediante una sesion


using System;
using System.Collections.Generic;
using System.Web;
using System.Web.SessionState;

public class HttpModuleCutom: IHttpModule, IRequiresSessionState
{
public HttpModuleCutom()
{
//
// TODO: Add constructor logic here
//
}

#region IHttpModule Members

public void Dispose()
{
//throw new NotImplementedException();
}

public void Init(HttpApplication context)
{
context.PostRequestHandlerExecute += new EventHandler(context_PostRequestHandlerExecute);

}
void context_PostRequestHandlerExecute(object sender, EventArgs e)
{
if ((sender as HttpApplication).Context.Session != null)
{
if ((sender as HttpApplication).Context.Session["Key"] == null)
{
string s = System.Guid.NewGuid().ToString();
(sender as HttpApplication).Context.Session["Key"] = s;
}
else { (sender as HttpApplication).Context.Session["Key"] = null; }
}
}



y luego hay que registrarla en el web.config

<httpModules>
<add name="HttpModuleCutom" type="HttpModuleCutom"/>
<add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
</httpModules>


Ahora creen una pagina sencilla como la de la imagen




Cuando compilen y cargen la pagina esta automaticemente se va al evento PostRequestHandlerExecute donde vamos hacer el trabajo de validadcion y verifica que la session exista y si no existe la va a crear por primera vez

ahora al pulsar el boton se va activar el evento y es alli donde entra a tallar la clase creada pues veremos que el Session["Key"] tiene asignado un valor



Y cuando termina de ejecutarse pasa al evento PostRequestHandlerExecute y como detecta que es un segundo postback le asigana null a la session


y al pasar nuevamente por el evento click del boton no ejecuta la accion por la Session["Key"]= null



1 comentario:

  1. Hola no se si falte en su codigo, lo quise implementar, pero no me funciono

    ResponderEliminar