【IT168技术文档】
从界面的角度来看,母版的使用是很简单的,如果联系Page类、HttpHandle等技术点来看,应该思考一下应用了母版的aspx页面是如何进行HttpHandle处理的。
在<httpHandles>配置中,Page类是.aspx文件的处理类,这就意味着应用了母版的aspx页面同样也是Page类处理的。那么就要思考母版页上的控件是如何与aspx上的控件进行结合的。
先来分析一下应用了母版页的aspx的响应流程:
①用户的Web请求,触发对应于.aspx的HttpHandle(即:Page类)开始工作。
②Page类首先读取@ Page指令。如果该指令引用一个母版页,则也读取该母版页。如果这是第一次请求这两个页,则两个页都要进行编译。
③包含更新的内容的母版页合并到aspx页的的控件树中。
④aspx页面中各个 Content 控件的内容合并到母版页中相应的ContentPlaceHolder控件中。
⑤浏览器中呈现得到的合并页。
最后会形成这么一个层次关系的控件树:

如果是嵌套母版,则在ContentPlaceHolder下又有一颗Mater Page子树。
一般说来,此结构对如何构造页或编写页的程序无任何影响。但是在某些情况下,如果在母版页上设置一个页范围的属性,则该属性可能会影响aspx页中控件的行为,这是因为母版页是页上控件的最近的父级。例如,如果在aspx页上将 EnableViewState属性设置为true,而在母版页中将相同的属性设置为false,实际上会禁用视图状态,因为母版页上的设置具有优先权。
由于母版页最终会解析成为aspx页Page控件容器的下一级控件容器,因此在母版页上的路径在运行时,都会以aspx页为准,如:如果获取HttpRequest对象的CurrentExecutionFilePath属性,则无论是在aspx页代码还是母版页代码中,路径都表示aspx页的位置。
对于服务器控件中的URL相关属性,ASP.net会自动的修改为相对于aspx页面的路径。
既然母版页是Page控件容器的下一级控件容器,因此在页面事件触发顺序上,母版页也就象是Page上的一个控件,其事件触发顺序如下:
母版页控件 Init 事件à内容控件 Init 事件à母版页 Init 事件à内容页 Init 事件à内容页 Load 事件à母版页 Load 事件à内容控件 Load 事件à内容页 PreRender 事件à母版页 PreRender 事件à母版页控件 PreRender 事件à内容控件 PreRender 事件。
与控件在页面的触发顺序比较一下,从事件的触发顺序上看,母版页就完全如何Page中的控件一样。
在aspx页上可以引用母版上定义的控件、方法和属性。
实现此功能,需要分为两步:
第一步:在aspx页中添加<@ MasterType>指令,将Page类中的Master属性强类型化。
第二步:通过FindContorl方法,在Master的控件树上找到所需要的控件。
例:建立MasterPage.master和Index.aspx,在母版和Index.aspx中分别插入一个文本框和一个按钮,然后在Index.aspx中引用MasterPage中的按钮和文本框控件以及MasterPage.master.cs中定义的属性和方法。
例中除了引用母版控件外,还需要引用母版类中定义的属性和方法,注意:只有public的属性和方法才可能被aspx页面引用。