2009-08-25 10 views
5

Pude haber entendido mal el significado de base.OnLoad(e); Mi entendimiento fue que esta declaración llamará al método OnLoad de la clase base de la clase desde donde se llama. Sin embargo, cuando uso el depurador para recorrer el código, veo resultados diferentes.base.OnLoad (e) en una página ASP.NET

public abstract class BaseUC : System.Web.UI.UserControl 
{ 
    protected override void OnLoad(EventArgs e) 
    { 
    base.OnLoad(e); 

    SomeAbstractMethod(); 
    } 
} 

En la clase concreta ascx.cs

public partial class MyUserControl : BaseUC 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     //On Load logic 
    } 
} 

que tienen un punto de interrupción en base.OnLoad(e). Cuando presiono F11 (Entrar en), el depurador me lleva a Page_Load de MyUserControl, por lo que el flujo de control es:

BaseUC.OnLoad() 
MyUserControl.Page_Load() 
BaseUC.SomeAbstractMethod() 

Puede alguien explicar lo que está pasando aquí?

Respuesta

12
  1. BaseUC.Descargar llamadas Control.OnLoad que desencadena el evento Load.
  2. El método Page_Load funciona debido a AutoEventWireUp = True y se ejecuta cuando se ejecuta el evento Load.
  3. BaseUC continuará la ejecución y llamará a SomeAbstractMethod.
+0

"BaseUC.Onload llama a Control.OnLoad que desencadena el evento Load". ¿Qué línea está haciendo que esto suceda? – DotnetDude

+0

base.OnLoad (e): el código que hay dentro elevará el evento. –

+0

Supongo que esa es la parte que no entiendo. ¿Por qué base.OnLoad (e) llama al Control.OnLoad (en este caso, MyUserControl.Page_Load() )? – DotnetDude

5

Load y OnLoad son cosas diferentes =)

Load es un método que existe en la página que se llama el tiempo de ejecución ASP.net (gracias a la magia de AutoEventWireup proceso de carga) es el método que plantea el evento Load, por lo que al colocar el código antes de la llamada base.OnLoad (e) puede hacer que el código se ejecute antes de que se genere el evento, después de que se ejecute el código después de se produce el evento.

Eche un vistazo a this blog entry de la entrada de Infinities Loop en weblogs.asp.net acerca de esto para una explicación un poco más amplia.

0

¿Tiene los símbolos de depuración cargados para System.Web? F11 no entrará en el código que no tiene cargado.

+0

-1 Definitivamente no es lo que está pasando aquí ... Otras respuestas tienen la idea correcta – LorenVS

+1

Es la parte más obvia del problema. El OP intenta ingresar a un método en el BCL ... Los otros carteles son absolutamente correctos acerca de la llamada a Page_Load, pero es importante comprender también lo que está haciendo el depurador. –

+1

Ser capaz de entrar en System.Web habría mostrado la activación del evento Load y que Page_Load reaccionará en él. – sisve

2

Curiosamente, ¿qué esperas ver? No creo que lo veas entrar en base.OnLoad (e), ya que tu clase base en ese punto es System.Web.UI.UserControl, y esa es una clase de sistema, ... así que lo más probable es que no tenga el código fuente para poder acceder.

+1

Lo esperaba: BaseUC.OnLoad() BaseUC.SomeAbstractMethod() MyUserControl.Page_Load() – DotnetDude

Cuestiones relacionadas