2010-04-29 9 views
27

Ho il seguente PerformanceFactsheet.aspx.cs pagina di classeCome eseguire Page_Load() nella classe base della pagina?

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); 
    } 
} 

dove FactsheetBase è definito come

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"]);    
    } 
} 

Il problema è che Page Load di FactsheetBase non è in esecuzione.

Qualcuno può dirmi cosa sto facendo male? C'è un modo migliore per ottenere il risultato che sto cercando?

Grazie

+0

Per i motori di ricerca: Ho usato questo Q & A per risolvere finalmente un problema con l'accesso a Session tramite un costruttore nella mia classe base, che ha dato la seguente eccezione: 'Lo stato della sessione può essere utilizzato solo quando enableSessionState è impostato su true, in un file di configurazione o nella direttiva Page. Assicurati inoltre che System.Web.SessionStateModule o un modulo di stato sessione personalizzato sia incluso nella sezione \ \ nella configurazione dell'applicazione. – sfuqua

risposta

45

abbiamo affrontato il problema simile, Tutto quello che devi fare è solo registrare il gestore nel costruttore. :)

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"]);    
    } 
} 

altro approccio sarebbe quello sostituzione OnLoad() che è meno preferita.

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

Perché dici che l'override di 'OnLoad' è meno preferito? –

+3

perché in questo approccio potresti dimenticare di chiamare la base.OnLoad (e) che influirà negativamente sull'oggetto Page. Inoltre, l'evento Load viene esposto sull'oggetto Page in cui è possibile registrare tutti i gestori che si desidera, in questo modo non si può modificare tutto ciò che esiste già ma aggiungere il proprio gestore all'evento. –

+10

Accetto che * dimenticando di chiamare base.OnLoad (e) * è meno preferito, ma vale la pena notare che l'override di 'OnLoad' ti dà il controllo su quando il tuo codice viene eseguito - puoi dire se vuoi che il tuo codice passi prima o dopo altri gestori di 'Load'. Questo probabilmente non è molto importante, ma è ** diverso **, non peggiore o migliore dell'aggiunta di un altro gestore. –

6

Invece di un metodo Page Load(), ignorare OnLoad() e chiamare base.OnLoad() in PerformanceFactsheet

3

Uhm, ho forse sbagliato, ma credo che questo sia dovuto alla eredità: si sta sovrascrivendo il metodo FactsheetBase Page_Load nella classe derivata.

Al fine di avere eseguito si dovrebbe fare qualcosa di simile

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 sicuramente ti ha dato una soluzione più pulita (io non sono un programmatore ASPX).

+0

che non verrà compilato. Dovrò essere chiamato come base.OnLoad (e); –

+0

Ho provato questo @curious_geek e ha funzionato per me.Ho deciso di accettare la tua risposta come corretta anche se la risposta di NeXuS richiede che abbia 'base.Page_Load (mittente, e); 'in ogni implementatore – DaveDev

+0

Beh, felice di sapere che ha funzionato anche se i miei ricordi di ASPX sono così arrugginiti!: D – NeXuS

3

provare questo

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

provare questo:

 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"]);    
    } 
} 
Problemi correlati