2008-09-08 19 views
5

Tenemos algún código heredado que necesita identificar en el Page_Load qué evento causó la devolución de datos. Por el momento esto se lleva a cabo mediante la comprobación de los datos de solicitud de este tipo ...Cómo identificar el evento Postback en Page_Load

si (Request.Form [ "__ EventTarget"]! = Null
& & (Request.Form [ "__ EventTarget"]. IndexOf ("BaseGrid")> -1 // BaseGrid evento (
              || Request.Form! = botón [ "btnSave"] nula // Guardar por ejemplo, clasificar)

Esto es bastante feo y se rompe si alguien cambia el nombre de un control. ¿Hay una mejor manera de hacerlo? g esto?

Reescribiendo cada página para que no sea necesario marcar esto en Page_Load no es una opción en este momento.

Respuesta

6

Esto debe conseguir que el control que causó la devolución de datos:

public static Control GetPostBackControl(Page page) 
{ 
    Control control = null; 

    string ctrlname = page.Request.Params.Get("__EVENTTARGET"); 
    if (ctrlname != null && ctrlname != string.Empty) 
    { 
     control = page.FindControl(ctrlname); 
    } 
    else 
    { 
     foreach (string ctl in page.Request.Form) 
     { 
      Control c = page.FindControl(ctl); 
      if (c is System.Web.UI.WebControls.Button) 
      { 
       control = c; 
       break; 
      } 
     } 
    } 
    return control; 
} 

leer más sobre esto en esta página: http://ryanfarley.com/blog/archive/2005/03/11/1886.aspx

+0

¿Esto también obtendrá controles anidados? Page.FindControl (si mal no recuerdo) no busca recursivamente ... –

+0

No encontrará controles dentro de un control de tipo listview, no. – Espo

0

Además del código anterior, si el control es de tipo ImageButton entonces agregue el código a continuación,

if (control == null) 
{ for (int i = 0; i < page.Request.Form.Count; i++) 
    { 
     if ((page.Request.Form.Keys[i].EndsWith(".x")) || (page.Request.Form.Keys[i].EndsWith(".y"))) 
      { control = page.FindControl(page.Request.Form.Keys[i].Substring(0, page.Request.Form.Keys[i].Length - 2)); break; 
      } 
    } 
} 
0

Acabo de publicar todo el código (que incluye el botón de imagen/verificación de control adicional que causa s postback). Gracias Espo.

public Control GetPostBackControl(Page page) 
{ 
    Control control = null; 
    string ctrlname = page.Request.Params.Get("__EVENTTARGET"); 
    if ((ctrlname != null) & ctrlname != string.Empty) 
     { 
     control = page.FindControl(ctrlname); 
     } 
    else 
     { 
     foreach (string ctl in page.Request.Form) 
      { 
       Control c = page.FindControl(ctl); 
       if (c is System.Web.UI.WebControls.Button) 
        { control = c; break; } 
      } 
     } 
// handle the ImageButton postbacks 
if (control == null) 
{ for (int i = 0; i < page.Request.Form.Count; i++) 
    { 
     if ((page.Request.Form.Keys[i].EndsWith(".x")) || (page.Request.Form.Keys[i].EndsWith(".y"))) 
      { control = page.FindControl(page.Request.Form.Keys[i].Substring(0, page.Request.Form.Keys[i].Length - 2)); break; 
      } 
    } 
} 
return control; 
} 
Cuestiones relacionadas