2010-04-29 20 views
27

que tienen la siguiente clase de página PerformanceFactsheet.aspx.cs¿Cómo ejecutar Page_Load() en la clase base de la página?

public partial class PerformanceFactsheet : FactsheetBase 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     // do stuff with the data extracted in FactsheetBase 
     divPerformance.Controls.Add(this.Data); 
    } 
} 

donde FactsheetBase se define como

public class FactsheetBase : System.Web.UI.Page 
{ 
    public MyPageData Data { get; set; } 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     // get data that's common to all implementors of FactsheetBase 
     // and store the values in FactsheetBase's properties 
     this.Data = ExtractPageData(Request.QueryString["data"]);    
    } 
} 

El problema es que Page_Load de FactsheetBase no se está ejecutando.

¿Alguien puede decirme qué estoy haciendo mal? ¿Hay una mejor manera de obtener el resultado que estoy buscando?

Gracias

+0

Para los motores de búsqueda: He utilizado este Q & A finalmente resolver un problema con el acceso a la sesión a través de un constructor de mi clase base, la cual dio la siguiente excepción: 'El estado de la sesión solo se puede usar cuando enableSessionState se establece en verdadero, ya sea en un archivo de configuración o en la directiva de la página. Asegúrese también de que System.Web.SessionStateModule o un módulo de estado de sesión personalizado esté incluido en la sección \ \ en la configuración de la aplicación. – sfuqua

Respuesta

45

nos enfrentamos al problema similar, Todo lo que necesita hacer es registrar el controlador en el constructor. :)

public class FactsheetBase : System.Web.UI.Page 
{ 

    public FactsheetBase() 
    { 
     this.Load += new EventHandler(this.Page_Load); 
    } 

    public MyPageData Data { get; set; } 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     // get data that's common to all implementors of FactsheetBase 
     // and store the values in FactsheetBase's properties 
     this.Data = ExtractPageData(Request.QueryString["data"]);    
    } 
} 

Otro enfoque sería OnLoad override() que es menos preferido.

public class FactsheetBase : System.Web.UI.Page 
{ 

    public FactsheetBase() 
    { 
    } 

    public MyPageData Data { get; set; } 
    protected override void OnLoad(EventArgs e) 
    { 
     //your code 
     // get data that's common to all implementors of FactsheetBase 
     // and store the values in FactsheetBase's properties 
     this.Data = ExtractPageData(Request.QueryString["data"]);    

     base.OnLoad(e); 
    } 
} 
+3

¿Por qué dice que anular 'OnLoad' es menos preferido? –

+3

porque en ese enfoque puede olvidarse de llamar a la base.OnLoad (e) lo cual afectará adversamente el objeto de la Página. Y también el evento Load se expone en el objeto Page en el que puede registrar tantos manejadores como desee, de esta forma no se cambiará nada de lo que ya existe, sino que se agregará su propio controlador en el evento. –

+10

Estoy de acuerdo en que * olvidar llamar a base.OnLoad (e) * es menos preferido, pero vale la pena señalar que anular 'OnLoad' te permite controlar cuándo se ejecuta el código: puedes decir si quieres que el código vaya antes o después de otros manejadores 'Load'. Esto probablemente no es importante con mucha frecuencia, pero es ** diferente **, no es peor o es mejor que agregar otro controlador. –

6

En lugar de un método Load(), anula onLoad() y llamar base.OnLoad() en PerformanceFactsheet

3

Uhm, tal vez equivocada, pero creo que esto es debido a la herencia: va a sobrescribir el método Load FactsheetBase en la clase derivada.

Con el fin de tenerlo ejecutados usted debe hacer algo como

public partial class PerformanceFactsheet : FactsheetBase 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     base.Page_Load(sender, e); 
     // do stuff with the data extracted in FactsheetBase 
     divPerformance.Controls.Add(this.Data); 
    } 
} 

EDIT: n8wrl definitivamente le dio una solución más limpia (no soy un programador ASPX).

+0

que no se compilará. Tendrá que ser llamado como base.OnLoad (e); –

+0

Probé esto @curious_geek y funcionó para mí. He decidido aceptar tu respuesta como correcta porque la respuesta de NeXuS requiere que tenga 'base.Page_Load (remitente, e); 'en cada implementador – DaveDev

+0

¡Bueno, me alegra saber que funcionó a pesar de que mis recuerdos de ASPX están tan oxidados!: D – NeXuS

3

prueba este

public partial class PerformanceFactsheet : FactsheetBase 
{ 
    public PerformanceFactsheet() 
    { 
     this.Load += new EventHandler(this.Page_Load); 
    } 

    protected void Page_Load(object sender, EventArgs e) 
    {    
     divPerformance.Controls.Add(this.Data); 
    } 
} 

public abstract class FactsheetBase : System.Web.UI.Page 
{ 
    public MyPageData Data { get; set; } 
    public FactsheetBase() 
    { 
     this.Load += new EventHandler(this.Page_Load); 
    } 

    new protected void Page_Load(object sender, EventArgs e) 
    {    
     this.Data = ExtractPageData(Request.QueryString["data"]); 
    } 
} 
0

prueba este:

 public partial class PerformanceFactsheet : FactsheetBase 
{ 
    protected override void Page_Load(object sender, EventArgs e) 
    { 
base.Page_Load(sender, e); 
     // do stuff with the data extracted in FactsheetBase 
     divPerformance.Controls.Add(this.Data); 
    } 
} 

public class FactsheetBase : System.Web.UI.Page 
{ 
    public MyPageData Data { get; set; } 
    protected virtual void Page_Load(object sender, EventArgs e) 
    { 
     // get data that's common to all implementors of FactsheetBase 
     // and store the values in FactsheetBase's properties 
     this.Data = ExtractPageData(Request.QueryString["data"]);    
    } 
} 
Cuestiones relacionadas