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
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);
}
}
Au lieu D'une méthode Page_Load (), remplacez OnLoad() et call base.OnLoad () dans PerformanceFactsheet
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).
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"]);
}
}
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"]);
}
}
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);