在ASP.NET中,如果我覆盖页面生命周期事件,我应该在完成工作之前或之后调用其基本方法吗?它甚至重要吗?
protected override void OnPreRender(EventArgs e)
{
// My code goes here
base.OnPreRender(e);
// Or here
}
答案 0 :(得分:5)
是的,你应该关心。让我们说一下你需要在所有这些页面中插入一个新的基类。对我来说,继续调用基本方法比在以后进行大量重构更容易。
然后,也许你不需要这样做。
修改强>
基于对问题的编辑,这里有更多信息:
是的,你应该关心。有时您希望基类方法在您之前触发(在构造函数的情况下),有时您希望它在您的(析构函数)之后触发。
这可能意味着在您的代码到达时属性或对象是否可用之间的区别。
答案 1 :(得分:4)
asp.net事件模型中的“OnEvent”方法仅包装实际的事件调用(在本例中为“PreRender”事件)。因此,您唯一需要决定的是“我是否需要在工作之前或之后致电该活动”?
答案 2 :(得分:2)
答案是,这取决于代码在进行之前或之后应该做什么。
正如另一个所说,如果它是构造函数的东西,它应该去。析构函数应该追求。为了给出一个更具体的例子,如果你有代码处理页面并加载内容,填充下拉菜单和填充标签等,那么你希望在任何查看预先填充的内容并确定可见性的代码之前发生这种情况。业务规则逻辑,与页面上的数据有关。
答案 3 :(得分:1)
我认为在原则上打电话给他们是个好主意。可能确实,在您当前使用的框架版本中,基类方法中没有代码,但谁知道未来的版本。此外,关注点的分离将决定您编写的源自Page的代码不会假设Page类不会做任何事情,只会在其OnPreRender方法中引发PreRender事件。
答案 4 :(得分: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();
}
我建议你一个一般规则:如果你的页面的设计合同涉及创建和销毁某个事件范围之间控件使用的资源(即在Load之后和PreRender之前),那么尽可能晚地启动资源之前事件被触发,并在最终事件被触发后尽早销毁
答案 5 :(得分:1)
如果您打算再调用页面基本方法,可以使用
protected void Page_PreRender (object sender, EventArgs e) {...}
而不是
protected override void OnPreRender(EventArgs e) {
base.OnPreRender(e);
...
}