Master Page(母版页)是VS
中新引入的一个概念
它很好地实现界面设计的模块化
并且实现实现了代码的重用
它就像婚纱影楼中的婚纱模板
同一个婚 纱模板可以给不同的新人用
只要把他们的照片贴在已有的婚纱模板就可以形成一张漂亮的婚纱照片
这样可以大大简化婚纱艺术照的设计复杂度
这里的母版页就 像婚纱模板
而内容页面就像两位新人的照片
Master Page(母版页 扩展名是master)
它的使用跟普通的页面一样可以可视化的设计也可以编写后置代码与普通页面不一样的是它可以包含ContentPlaceHolder控件ContentPlaceHolder控件就是可以显示内容页面的区域
代码如下
<%@ Master Language=C# AutoEventWireup=true CodeFile=MasterPagemastercs Inherits=MasterPage %>
……
<form id=form runat=server>
<div>
<asp:contentplaceholder id=ContentPlaceHolder runat=server>
</asp:contentplaceholder>
</div>
</form>
……
注意
这里的声明指示符是<%@ Master…%>
其内部包含<asp:contentplaceholder……>控件
内容页(扩展名是aspx)
在建立内容页面的时候在添加新项对话框中要选中选择母版页复选框这样建立的页面就是内容页面内容页面在显示的时候会把母版面的内容一起以水 印淡化的形式显示出来而在母版页中的ContentPlaceHolder控件区域会被内容页面中的Content控件替换程序员可以在这里编写内容 页面中的内容
代码如下
<%@ Page Language=C# MasterPageFile=~/MasterPage/MPmaster AutoEventWireup=true CodeFile=Showaspxcs Inherits=MasterPage_Show Title=Untitled Page %>
<asp:Content ID=Content ContentPlaceHolderID=ContentPlaceHolder Runat=Server>
</asp:Content>
注意
这里的声明指示符中多了一项MasterPageFile=~/MasterPage/MPmaster这一项是在创建内容页面时根据选择母版页复选框的选中情况生成的它指明了该页是内容页面也指明了该内容页面的母版页是哪个页面
<asp:Content ……>就是要在其中显示的内容
一在母版页中编写后台代码访问母版页中的控件
与普通的aspx页面一样双击按钮即可编写母版页中的代码
二在内空页面中编写后台代码访问内容页面中的控件
与普通的aspx页面一样双击按钮即可编写母版页中的代码
三在内容页面中编写代码访问母版页中的控件
在内容页面中有个Master对象它是MasterPage类型它代表当前内容页面的母版页通过这个对象的FindControl方法我们可以找到母版面中的控件这样就可以在内容页面中操作母版页中的控件了
TextBox txt = (TextBox)((MasterPage)Master)FindControl(txtMaster)
txtText = thistxtContentText; ;
四在内容页面中编写代码访问母版页中的属性和方法
仍可能通过Master对象进行访问只不过在这里要把Master对象转换成具体的母版页类型然后再调用母版页中的属性和方不法
这里要说明的是母版页中要被内容页面调用的属性和方法必须是Public修改的否则无法调到
假设母版页中有下面的属性和方法
public string TextValue
{
get
{
return thistxtMasterText;
}
set
{
thistxtMasterText = value;
}
}
public void show(string str)
{
txtMasterText = str;
}
在内容页面中可以通过下代的代码来实现对母版页中方法的调用
((MasterPage_MP)Master)show(thistxtContentText)
((MasterPage_MP)Master)TextValue = thistxtContentText;
五在母版页中访问内容页面的控件
在母版页中可以通过在ContentPlaceHolder控件中调用FindControl方法来取得控件然后对控件进行操作
((TextBox)thisContentPlaceHolderFindControl(txtContent))Text = thistxtMasterText;
六在母版页中访问内容页面中的方法和属性
在母版页中调用子页面中的属性和方法有点难度因为我们无法像上一步中那样通过FindControl来找到方法和属性
于是我们想到在母版面的声明指示符中加入下面的代码
<%@ Reference Page=~/MasterPage/Showaspx %>
在运行的时候回发现有错误错误的内容是无法实现循环引用这是因为默认在子页面中引用了母版页你也就不能再在母版页中引用子页面了
在网上没找到更好的解决方法但这使我们想起C#是的反射它可以使我们动态获取页面对象并且可以调用它的属性和方法
代码如下
Type t = thisContentPlaceHolderPageGetType()
PropertyInfo pi = tGetProperty(ContentValue) //获取ContentValue属性
piSetValue(thisContentPlaceHolderPagethistxtMasterTextnull) //给属性赋值
MethodInfo mi = tGetMethod(SetValue) //获取SetValue()方法
object[] os = new object[]; //建造输入参数
os[] = txtMasterText;
miInvoke(thisContentPlaceHolderPage os) //调用SetValue方法
七在有多个内容页面使用母版面的情况下在母版页中根据不同的内容页面实现不同的操作
在母版页中可以加入多个不同的内容页面但在设计期间我们无法知道当前运行的是哪个内容页面所以只能通过分支判断当前运行的是哪个子页面来执行不同的操作这里也用到了反射的知识
代码如下
string s = thisContentPlaceHolderPageGetType()ToString() //取出内容页面的类型名称
if (s == ASPdefault_aspx) //根据不同的内容页面类型执行不同的操作
{
((TextBox)thisContentPlaceHolderFindControl(TextBox))Text = MastPage;
}
else if (s == ASPdefault_aspx)
{
((TextBox)thisContentPlaceHolderFindControl(TextBox))Text = Hello MastPage;
}
八在母版面与内容页面中JS代码的操作
在母版页或内容页面中的控件运行之后会自动生成ID如文本框的ID是txtContent在运行之后ID会自动变为 ctl_ContentPlaceHolder_txtContentname属性会变为 ctl$ContentPlaceHolder$txtContent
在JS代码中我们用documentgetElementById()方法根据id取得控件对象的时候应当使用ctl_ContentPlaceHolder_txtContent这个ID名否则会产生未找到对象的异常
母版页运行机制
母版页仅仅是一个页面模板单独的母版页是不能被用户所访问的单独的内容页也不能够使用母版页和内容页有着严格对应关系母版页中包含多少个 ContentPlaceHolder控件那么内容页中也必须设置与其相对应的Content控件当客户端浏览器向服务器发出请求要求浏览某个内容 页面时ASPNET引擎将同时执行内容页和母版页的代码并将最终结果发送给客户端浏览器
母版页和内容页的运行过程可以概括为以下个步骤
()用户通过键入内容页的URL来请求某页
()获取内容页后读取@ Page指令如果该指令引用一个母版页则也读取该母版页如果是第一次请求这两个页则两个页都要进行编译
()母版页合并到内容页的控件树中
()各个Content控件的内容合并到母版页中相应的ContentPlaceHolder控件中
()呈现得到结果页
母版页和内容页事件顺序
()母版页中控件Init事件
()内容页中Content控件Init事件
()母版页Init事件
()内容页Init事件
()内容页Load事件
()母版页Load事件
()内容页中Content控件Load事件
()内容页PreRender事件
()母版页PreRender事件
()母版页控件PreRender事件
()内容页中Content控件PreRender事件
使用母版页的优点
()有利于站点修改和维护降低开发人员的工作强度
()有利于实现页面布局
()提供一种便于利用的对象模型