母版页运行机制
当客户端浏览器向服务器发出请求,要求浏览页面时,ASP.NET执行引擎将执行内容页和母版页的代码,并将最终结果发送给客户端浏览器。整个过程如图5-3所示。
图5-3 运行过程图
母版页和内容页的运行过程可以概括为以下5个步骤。
(1)用户通过键入内容页的URL来请求某页。
(2)获取内容页后,读取@ Page指令。如果该指令引用一个母版页,则也读取该母版页。如果是第一次请求这两个页,则两个页都要进行编译。
(3)母版页合并到内容页的控件树中。
(4)各个Content控件的内容合并到母版页中相应的ContentPlaceHolder控件中。
(5)呈现得到结果页。
整个过程具有很强的逻辑性,并且母版页和内容页配合的非常巧妙。从用户角度来看,合并后的母版页和内容页是一个完整的页面,并且其URL访问路径与内容页的路径相同。从开发人员角度来看,控件的巧妙应用和配合,是实现的关键。注意,在运行时,母版页成为了内容页的一部分。实际上,母版页与用户控件的作用方式大致相同,即作为内容页的一个子级,并作为该页中的一个容器。然而,当前母版页是所有呈现到浏览器中的服务器控件的容器。此时,回想过去使用的#include、用户控件等实现方法,则可以更加深入理解母版页功能。
母版页和内容页的事件过程:
具体过程如图5-4所示。
图5-4 母版页和内容页加载过程图
加载母版页和内容页共需要经过8个过程。这8个过程显示初始化和加载母版页及内容页是一个相互交叠的过程。基本过程是,初始化母版页和内容页控件树,然后,初始化母版页和内容页页面,接着,加载母版页和内容页,最后,加载母版页和内容页控件树。以上8个过程对应着11个具体事件。这些事件如下所示。
(1)母版页中控件Init事件;
(2)内容页中Content控件Init事件;
(3)母版页Init事件;
(4)内容页Init事件;
(5)内容页Load事件;
(6)母版页Load事件;
(7)内容页中Content控件Load事件;
(8)内容页PreRender事件;
(9)母版页PreRender事件;
(10)母版页控件PreRender事件。
(11)内容页中Content控件PreRender事件。
实际上,8个过程或者是11个事件都用于说明母版页和内容页中的具体事件顺序。内容页和母版页中会引发相同的事件。例如,两者都引发Init、Load和PreRender事件。引发事件的一般规律是,初始化Init事件从最里面的控件(母版页)向最外面的控件(Conetent控件及内容页)引发,所有其他事件则从最外面的控件向最里面的控件引发。需要牢记,母版页会合并到内容页中,并被视为内容页中的一个控件,这一点十分有用。
在创建应用程序中,必须注意以上事件顺序。例如,当在内容页中访问母版页的属性或者服务器控件时,如果按照过去的处理思路,可能会在内容页的Page_Load事件处理程序中加以实现。