Comment exécuter Page Load() dans la classe de base de la Page?

J'ai la PerformanceFactsheet suivante.aspx.classe de page cs

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 Page_Load de FactsheetBase ne s'exécute pas.

Quelqu'un peut-il me dire ce que je fais mal? Est-il une meilleure façon d'obtenir le résultat que je suis après?

Merci

29
demandé sur DaveDev 2010-04-29 16:04:54

6 réponses

Nous avons fait face au problème similaire, Tout ce que vous devez faire est juste 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 serait de remplacer OnLoad(), qui est moins privilégiées.

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);
    }
}
47
répondu this. __curious_geek 2010-04-29 13:22:22

Au lieu D'une méthode Page_Load (), remplacez OnLoad() et call base.OnLoad () dans PerformanceFactsheet

7
répondu n8wrl 2010-04-29 12:09:00

Uhm, je me trompe peut-être, 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 l'exécuter, vous devriez 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 définitivement donné une solution plus propre (Je ne suis pas un programmeur ASPX).

4
répondu NeXuS 2010-04-29 12:13:40

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"]);
    }
}
4
répondu serkanh 2012-10-24 09:26:13

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"]);            
    }
}
0
répondu kav 2015-03-19 16:15:13

Rendez le chargement de la page public, et appelez - le d'une manière comme celle-ci depuis l'autre page:

this.myPageOrUserControl.Page_Load(null, EventArgs.Empty);
0
répondu Tyler S. Loeper 2018-06-15 15:33:44