一个bug引发的思考 --- ASP.NET页面加载顺序讨论

文章转载自:http://it.dianping.com/asp_net_page_load_order_problem_discussion.htm

前段时间遇到一个比较奇怪的case,情况是这样的,我在母版页render的时候会吐一些性能数据(例如Sql执行次数)用作监控,但总感觉每次 监控的数据内容都不全,明明load某张页面应该是需要执行10条sql,结果监控只监控到8条或9条。但单步调试却发现所有sql都是执行的,那没有监 控到的sql到底飞哪去了呢?

首先定位有问题的那句sql,我找到了没有被监控的sql语句是在用户控件的render事件里执行的。我大概猜到了问题的所在,可能由于页面加载次序的问题导致了监控数值还没统计完就render出来了?于是去翻了一下msdn,根据MSDN的记载(详见:http://msdn.microsoft.com/zh-cn/library/dct97kc3.aspx),页面的加载顺序是这样的:

母版页控件 Init 事件。
内容控件 Init 事件。
母版页 Init 事件。
内容页 Init 事件。
内容页 Load 事件。
母版页 Load 事件。
内容控件 Load 事件。
内容页 PreRender 事件。
母版页 PreRender 事件。
母版页控件 PreRender 事件。
内容控件 PreRender 事件。

这边只是列出了prerender事件,而我需要的是render事件的触发顺序,所以我自己写了一个程序做测试,结果如下:

内容页 控件 init
母版页 控件 init
母版页 init
内容页 init
内容页 load
母版页 load
内容页控件 load

母版页控件 load

内容页 prerender
母版页 prerender
内容页 控件 prerender

母版页 控件 prerender

内容页 prerender complete

内容页 render
母版页 render
内容页 控件 render

母版页 控件 render

问题确实出在页面的加载顺序问题上。因为母版页的render事件在内容页控件的render事件之前,所以我是先output了统计值,再执行那条sql语句。由此造成了监控数据的不正确。

简单想了一下解决方案,为了能让内容页控件的sql被监控到,我把执行sql的函数搬到了load事件里去执行。这个其实从设计角度确实也该如此 做,load就是负责加载数据的,render就是负责显示数据的,非要把两步并一步图省事,到头来就会碰上这种鸟不拉SHI的问题(- -#)。

同时,我还发现母版页控件是最后render的。所以如果可以把监控的东西放到一个母版的控件里,那就可以 handle到内容页控件的render里的sql执行了,呵呵。如果sql代码很多已经写到内容页控件里一时半会无法迁移到load里的话,可以考虑将 监控迁移到母板页控件的render里。

不过不管哪种解决办法,最根本的是要了解页面的真实加载顺序,否则没法给出对应的解决方案。不过没啥规律可循的加载顺序要记脑子里也不容易,不如将此文mark一下,等到要用到再翻出来查一下顺序,应该会对您今后的开发有帮助的,嘿嘿:)

文章中测试代码需要下载请至原文章页面:http://it.dianping.com/asp_net_page_load_order_problem_discussion.htm

posted @ 2008-12-08 10:10  Figo Yang  阅读(2967)  评论(11编辑  收藏  举报