代码之家  ›  专栏  ›  技术社区  ›  Serhat Ozgel

我应该在什么时候调用ASP.NET事件的基本方法?

  •  2
  • Serhat Ozgel  · 技术社区  · 15 年前

    在ASP.NET中,如果我重写了一个页面生命周期事件,我应该在执行工作之前或之后调用它的基方法吗?这甚至重要吗?

    protected override void OnPreRender(EventArgs e)
    {
        // My code goes here
        base.OnPreRender(e);
        // Or here
    }
    
    6 回复  |  直到 15 年前
        1
  •  5
  •   ChrisLively    15 年前

    是的,你应该关心。让我们假设您需要在所有这些页面中插入一个新的基类。对我来说,只需继续调用基本方法就比以后进行大量重构更容易了。

    再说一遍,也许你不需要这么做。

    编辑
    根据对问题的编辑,以下是更多信息:

    是的,你应该关心。有时,您希望基类方法在您的方法之前激发(对于构造函数),有时希望它在您的方法之后激发(析构函数)。

    这可能意味着在代码到达某个属性或对象时,该属性或对象是否可用。

        2
  •  4
  •   BC.    15 年前

    ASP.NET事件模型中的“onevent”方法只包装实际的事件调用(在本例中是“prerender”事件)。所以你唯一需要决定的是“我需要在工作之前或之后打电话给活动吗”?

        3
  •  2
  •   hyprsleepy    14 年前

    答案是,这取决于代码在做什么,它应该在代码之前还是之后进行。

    正如另一个人所说,如果它是构造器的东西,那么它应该先走。析构函数应该在后面。为了给出一个更具体的示例,如果您有处理页面和加载内容、填充下拉列表和填充标签等的代码,那么您希望在查看预填充内容并确定与页面上的数据有关的可见性或业务规则逻辑的任何代码之前发生这种情况。

        4
  •  1
  •   Mike Powell    15 年前

    我认为原则上打电话给他们是个好主意。在当前使用的框架版本中,基类方法中没有代码,但谁知道未来的版本呢?此外,关注点的分离还将指示您编写的从page派生的代码不假定page类只在其onprerender方法中引发prerender事件。

        5
  •  1
  •   usr-local-ΕΨΗΕΛΩΝ    14 年前

    没有单一的规则。我可以给你举个例子。我的ASP.NET webapp使用一个由母版页打开的nhibernate事务,当页面结束时由它提交/回滚。

    嗯,我必须在oniit方法中尽早初始化事务(master没有类似于onpreinit的page),否则用户控件在page.load之前无法访问事务。

    同样的规则也适用于提交。控件可能希望在其生命周期的最后阶段更新对象,然后我必须在卸载方法中,甚至在处置器中尽可能晚地关闭事务!

    所以…在我的情况下…

    void OnInit(EventArgs e) {
        transaction = session.BeginTransaction();
        base.OnInit(e);
    }
    
    void OnUnload(EventArgs e) {
        base.OnUnload(e);
        try{
            transaction.Commit();
        } catch {}
    }
    
    void OnError(EventArgs e) {
        base.OnError();
        transaction.Rollback();
    }
    

    我建议您遵循一个一般规则:如果页面的设计合同涉及创建和销毁某些事件范围(即加载后和预呈现前)之间的控件使用的资源,请尽可能晚地初始化资源。 之前 事件被激发,并尽早销毁 之后 最后一个事件被激发

        6
  •  1
  •   Iain Ballard    14 年前

    如果无论如何都要调用页基方法,则可以使用

    protected void Page_PreRender (object sender, EventArgs e) {...}
    

    而不是

    protected override void OnPreRender(EventArgs e) {
       base.OnPreRender(e);
       ...
    }