2

在 ASP.NET 中,如果我重写页面生命周期事件,我应该在工作之前还是之后调用它的基本方法?这还重要吗?

protected override void OnPreRender(EventArgs e)
{
    // My code goes here
    base.OnPreRender(e);
    // Or here
}
4

6 回答 6

5

是的,你应该关心。假设您需要在所有这些页面中插入一个新的基类。对我来说,直接调用基础方法比稍后进行大量重构要容易。

再说一次,也许你不需要这样做。

编辑
基于对问题的编辑,这里有更多信息:

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

这可能意味着在您的代码到达时属性或对象是否可用之间的差异。

于 2009-02-13T19:50:45.753 回答
4

asp.net 事件模型中的“OnEvent”方法仅包装实际的事件调用(在本例中为“PreRender”事件)。因此,您唯一需要决定的是“我需要在工作之前还是之后调用该事件”?

于 2009-02-13T19:49:22.793 回答
2

答案是,这取决于代码在做什么之前或之后。

正如另一个人所说,如果它是构造函数的东西,它应该放在前面。析构函数应该继续。举一个更具体的例子,如果您有处理页面和加载内容、填充下拉列表和填充标签等的代码,那么您希望在查看预填充内容并确定可见性或与页面上的数据有关的业务规则逻辑。

于 2010-10-28T17:30:25.710 回答
1

我认为原则上给他们打电话是个好主意。在您当前使用的框架版本中,基类方法中没有代码可能是真的,但谁知道未来的版本。此外,关注点分离将规定您编写的派生自 Page 的代码不会假定 Page 类除了在其 OnPreRender 方法中引发 PreRender 事件之外什么都不做。

于 2009-02-13T19:54:47.053 回答
1

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

好吧,我必须尽早在 OnInit 方法中初始化事务(Master 没有类似 Page 的 OnPreInit),否则用户控件在 Page.Load 之前无法访问事务。

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

所以……就我而言……

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();
}

我会建议你一个一般规则:如果你的页面的设计合同涉及创建和销毁某个事件范围之间的控件使用的资源(即在加载之后和 PreRender 之前),那么在事件触发之前尽可能晚地初始化资源,并在触发最终事件尽早销毁它

于 2010-10-28T10:31:01.143 回答
1

如果您仍然要调用页面基础方法,则可以使用

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

而不是

protected override void OnPreRender(EventArgs e) {
   base.OnPreRender(e);
   ...
}
于 2010-10-28T11:52:59.447 回答