2010-04-29 9 views
27

J'ai la PerformanceFactsheet.aspx.cs suivante classe pageComment exécuter Page_Load() dans la classe de base de la page?

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

où FactsheetBase est défini comme

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

Le problème est que le Page_Load de FactsheetBase n'est pas en cours d'exécution.

Quelqu'un peut-il me dire ce que je fais mal? Y at-il un meilleur moyen d'obtenir le résultat que je suis après?

Merci

+0

Pour les moteurs de recherche: J'ai utilisé ce Q & A pour résoudre enfin un problème avec l'accès à la session par un constructeur dans ma classe de base, a donné l'exception suivante: 'L'état de session ne peut être utilisé que si enableSessionState est défini sur true, dans un fichier de configuration ou dans la directive Page. Assurez-vous également que System.Web.SessionStateModule ou un module d'état de session personnalisé est inclus dans la section \ \ de la configuration de l'application. » – sfuqua

Répondre

45

Nous avons été confrontés au même problème, Tout ce que vous devez faire est de simplement enregistrer le gestionnaire dans le constructeur. :)

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

Une autre approche consisterait à override OnLoad() qui est moins préféré.

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

Pourquoi dites-vous que le remplacement de« OnLoad »est moins recommandé? –

+3

car dans cette approche vous pourriez oublier d'appeler la base.OnLoad (e) qui affectera négativement l'objet Page. Et aussi l'événement Load est exposé sur l'objet Page sur lequel vous pouvez enregistrer autant de gestionnaires que vous voulez, de cette façon vous ne changez rien qui existe déjà mais ajoutez votre propre gestionnaire sur l'événement. –

+10

Je suis d'accord que * Oublier d'appeler base.OnLoad (e) * est moins préféré, mais il vaut la peine de noter que overriding 'OnLoad' vous donne le contrôle sur l'exécution de votre code - vous pouvez dire si vous voulez que votre code aille avant ou après d'autres gestionnaires 'Load'. Ce n'est probablement pas très important, mais c'est ** différent **, pas pire ou meilleur que d'ajouter un autre gestionnaire. –

6

Au lieu d'une méthode Page_Load(), passer outre OnLoad() et appelez base.OnLoad() dans PerformanceFactsheet

3

Uhm, je peut-être tort, mais je crois que cela est dû à l'héritage: vous écrasez la méthode FactsheetBase Page_Load dans la classe dérivée.

Pour avoir exécuté, vous devez faire quelque chose comme

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 vous a certainement une solution plus propre (je ne suis pas un programmeur ASPX).

+0

cela ne sera pas compilé. Il aura besoin d'être appelé comme base.OnLoad (e); –

+0

J'ai essayé ceci @curious_geek & cela a fonctionné pour moi.J'ai décidé d'accepter votre réponse comme correcte cependant parce que la réponse de NeXuS exige que j'ai 'base.Page_Load (expéditeur, e); 'dans chaque implémenteur – DaveDev

+0

Eh bien, heureux de savoir que cela a fonctionné même si mes souvenirs d'ASPX sont si rouillés!: D – NeXuS

3

essayez celui-ci

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

essayez celui-ci:

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