我的 aspx 页面页面是从基类驱动的,我的基类创建了我网站的动态标题。我有一个名为“genMenu”的方法,我在基类的 pageLoad 事件中调用以创建菜单。在某些页面中,我需要覆盖此方法,但是我们知道基类的页面加载在驱动页面的 pageLoad 之前触发。所以我真的不能那样做。
那么我如何在 aspx 页面中覆盖 genMenu 并且不要在基类中触发它。我知道我可以在所有驱动页面中手动调用 genMenu 函数,而不是在基类的 pageLoad 中调用它,但必须有更好的处理方法。
我的 aspx 页面页面是从基类驱动的,我的基类创建了我网站的动态标题。我有一个名为“genMenu”的方法,我在基类的 pageLoad 事件中调用以创建菜单。在某些页面中,我需要覆盖此方法,但是我们知道基类的页面加载在驱动页面的 pageLoad 之前触发。所以我真的不能那样做。
那么我如何在 aspx 页面中覆盖 genMenu 并且不要在基类中触发它。我知道我可以在所有驱动页面中手动调用 genMenu 函数,而不是在基类的 pageLoad 中调用它,但必须有更好的处理方法。
创建一个名为GenerateMenu
或类似的虚拟方法,并始终从基本页面调用它。在那里做实际的工作。然后,您需要拦截它的派生页面可以覆盖它。
例如,像这样:
// Base page
protected SomeType MenuVariable;
protected void Page_Load(object sender, EventArgs e)
{
this.GenerateMenu();
}
protected override void OnInit(EventArgs e) {
this.GetMenuVariable();
}
private void GetMenuVariable() {
// Some stuff with query string or the database
this.MenuVariable = FooBar();
}
protected virtual void GenerateMenu() {
// Generate the menu here
}
和:
// Derived page
protected override void GenerateMenu() {
// Calls from the base page Load event
// will be intercepted by this override
// Do the alternate work for this page
// here
}
根据澄清更新:
在您的基类中,定义一个virtual
名为 的方法AutoCallGenMenu()
,该方法默认返回 true。在基类中的页面加载中,检查该方法的结果,如果返回 true,则调用genMenu()
.
在要手动调用的页面中genMenu()
,覆盖AutoCallGenMenu()
返回false。然后,只需在需要的地方手动调用方法即可。
而不是pageLoad
,你为什么不使用pageInit
或page_init
调用你的方法,以便它发生在之前page_load
?
请参阅。执行顺序的网页生命周期,然后您可以决定最好使用哪种方法
http://msdn.microsoft.com/en-us/library/ms178472(v=vs.100).aspx
我可能误解了你的问题,但你也可以覆盖你的 genmenu 并忽略 thr 调用.base()