1

我的 aspx 页面页面是从基类驱动的,我的基类创建了我网站的动态标题。我有一个名为“genMenu”的方法,我在基类的 pageLoad 事件中调用以创建菜单。在某些页面中,我需要覆盖此方法,但是我们知道基类的页面加载在驱动页面的 pageLoad 之前触发。所以我真的不能那样做。

那么我如何在 aspx 页面中覆盖 genMenu 并且不要在基类中触发它。我知道我可以在所有驱动页面中手动调用 genMenu 函数,而不是在基类的 pageLoad 中调用它,但必须有更好的处理方法。

4

3 回答 3

1

创建一个名为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
}
于 2012-09-21T18:52:57.157 回答
1

根据澄清更新:

在您的基类中,定义一个virtual名为 的方法AutoCallGenMenu(),该方法默认返回 true。在基类中的页面加载中,检查该方法的结果,如果返回 true,则调用genMenu().

在要手动调用的页面中genMenu(),覆盖AutoCallGenMenu()返回false。然后,只需在需要的地方手动调用方法即可。

于 2012-09-21T18:52:59.243 回答
0

而不是pageLoad,你为什么不使用pageInitpage_init调用你的方法,以便它发生在之前page_load

请参阅。执行顺序的网页生命周期,然后您可以决定最好使用哪种方法

http://msdn.microsoft.com/en-us/library/ms178472(v=vs.100).aspx

我可能误解了你的问题,但你也可以覆盖你的 genmenu 并忽略 thr 调用.base()

于 2012-09-21T18:52:05.950 回答