web-dev-qa-db-fra.com

Comment exécuter Page_Load () dans la classe de base de la page?

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

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 n'est pas en cours d'exécution.

Quelqu'un peut-il me dire ce que je fais mal? Existe-t-il un meilleur moyen d'obtenir le résultat recherché?

Merci

30
DaveDev

Nous nous sommes heurtés au même problème. Tout ce que vous avez à faire, c’est enregistrez 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 surcharger 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);
    }
}
49

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

7
n8wrl

essaye celui-là

 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
serkanh

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

Pour le faire 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 fourni une solution plus propre (je ne suis pas un programmeur ASPX).

4
NeXuS

Rendez la page publique publique et appelez-la de la même manière à partir de l'autre page:

this.myPageOrUserControl.Page_Load(null, EventArgs.Empty);
0
Tyler S. Loeper

essaye celui-là:

     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
kav