2011-07-07 14 views
8

Me gusta Monkey parchear un sitio web ASPX para que pueda agregar cosas al método Page_Load dentro de un ensamblado compilado.Llamar a la función Page_Load original desde el código en línea

Mi primera idea fue la de añadir una etiqueta de script que contiene un segundo método Page_Load para el archivo ASPX de este modo:

<script language="CS" runat="server"> 
void Page_Load(object sender, System.EventArgs e) 
{ 
    // do some stuff in addition to the original Page_Load method 
} 
</script> 

Pero parece que sólo el método Load del código en línea será ejecutada y no el uno del archivo de código subyacente original (dentro del ensamblado compilado).

¿Es posible llamar al método original desde mi código en línea? ¿O hay alguna otra forma de agregar cosas que deberían ejecutarse directamente después de llamar al método Page_Load desde dentro del código en línea sin modificar el ensamblaje existente?

Respuesta

10

El modelo asp.net es que la página declarada en el archivo .aspx es actalmente una clase descendiente de la clase que hereda de System.Web.UI.Page declarada en el archivo .aspx.cs.

Así que se llama a su método Page_Load porque básicamente oculta el método Page_Load original. Siguiendo esa lógica, se podría hacer:

<script language="CS" runat="server"> 
void Page_Load(object sender, System.EventArgs e) 
{  
    base.Page_Load(sender, e); 
    // do some stuff in addition to the original Page_Load method 
} 
</script> 

No hay problemas de accesibilidad debido a asp.net por defecto declara Load y métodos similares como protected clases para descendientes puedan usarlos.

+1

Debería ser base.Page_Load (remitente, e); – mhenry1384

+0

¡Muchas gracias por esto! –

3

sí lo es:

void Page_Load(object sender, System.EventArgs e) 
{ 
    // Do some things before calling the original Page_Load 
    base.Page_Load(sender, e); 
    // Do some things after calling the original Page_Load 
} 

La razón por la que esto funciona es que el marco ASP.Net opera en el modelo donde el archivo .aspx se compila para arriba en una clase que hereda de la clase definida en el código detrás de archivo (en realidad la clase definida por el atributo Inherits en la etiqueta de la página)

<%@ Inherits="WebApplication1._Default" ... 
0

también puede tratar de utilizar PreLoad método. Esos llaman al Page_Load y puede ser una forma más limpia de manejar las cosas.

0

Esto funciona para mí.

<script language="CS" runat="server"> 
    protected override void OnLoad(EventArgs e) 
    { 
     base.OnLoad(e); 

     Response.Write("additional stuff"); 
    } 
</script> 
Cuestiones relacionadas