母版页(扩展名是.master)它的使用跟普通的页面一样,可以可视化的设计,也可以编写后置代码。与普通页面不一样的是,它可以包含ContentPlaceHolder控件,ContentPlaceHolder控件就是可以显示内容页面的区域。代码如下:<%@ Master Language="C#" AutoEventWireup="true" CodeFile="MasterPage.master.cs" Inherits="MasterPage" %>......
...... 注意: 1、这里的声明指示符是“<%@ Master...%>” 2、其内部包含
控件 内容页(扩展名是.aspx)在建立内容页面的时候,在“添加新项”对话框中要选中“选择母版页”复选框。这样建立的页面就是内容页面,内容页面在显示的时候会把母版面的内容一起以水印淡化的形式显示出来,而在母版页中的ContentPlaceHolder控件区域会被内容页面中的Content控件替换,程序员可以在这里编写内容页面中的内容。代码如下:<%@ Page Language="C#" MasterPageFile="~/MasterPage/MP.master" AutoEventWireup="true" CodeFile="Show1.aspx.cs" Inherits="MasterPage_Show1" Title="Untitled Page" %>
注意: 1、这里的声明指示符中多了一项MasterPageFile="~/MasterPage/MP.master",这一项是在创建内容页面时根据“选择母版页”复选框的选中情况生成的。它指明了该页是内容页面,也指明了该内容页面的母版页是哪个页面。 2、“
”就是要在其中显示的内容。 一、在母版页中编写后台代码,访问母版页中的控件: 与普通的aspx页面一样,双击按钮即可编写母版页中的代码 二、在内空页面中编写后台代码,访问内容页面中的控件: 与普通的aspx页面一样,双击按钮即可编写母版页中的代码 三、在内容页面中编写代码访问母版页中的控件: 1、TextBox txt = (TextBox)((MasterPage)Master).FindControl("txtMaster"); txt.Text = this.txtContent1.Text; 2、在母版添加控件和属性
public Label MasterPageLabel { get { return Label1; } set { Label1 = value; } } 先要在内容页面中添加 <%@ MasterType VirtualPath="~/MasterPage22.master" %> 然后后台才能调用 protected void Page_Load(object sender, EventArgs e) { Master.MasterPageLabel.Text = "现在时间:" + System.DateTime.Now.ToShortTimeString(); Master.MasterPageLabel.Font.Size = 20; } 四、在内容页面中编写代码访问母版页中的属性和方法: 仍可能通过Master对象进行访问,只不过在这里要把Master对象转换成具体的母版页类型,然后再调用母版页中的属性和方不法。 这里要说明的是:母版页中要被内容页面调用的属性和方法必须是Public修改的。否则无法调到。 假设母版页中有下面的属性和方法: 1、 public string TextValue { get { return this.txtMaster.Text; } set { this.txtMaster.Text = value; } } public void show(string str) { txtMaster.Text = str; } 在内容页面中可以通过下代的代码来实现对母版页中方法的调用: ((MasterPage_MP)Master).show(this.txtContent1.Text); ((MasterPage_MP)Master).TextValue = this.txtContent1.Text; 2、 在母版添加绑定标识、变量和属性<%= LabelText %> string _labelText = ""; public String LabelText { get { return _labelText; } set { _labelText = value; } } 同上在内容页面里加上: <%@ MasterType VirtualPath="~/MasterPage33.master" %> 在后台代码中 protected void Page_Load(object sender, EventArgs e) { Master.LabelText = "现在时间:" + System.DateTime.Now.ToShortTimeString(); } 五、在母版页中访问内容页面的控件: 在母版页中可以通过在ContentPlaceHolder控件中调用FindControl方法来取得控件,然后对控件进行操作。 ((TextBox)this.ContentPlaceHolder1.FindControl("txtContent1")).Text = this.txtMaster.Text; 六、在母版页中访问内容页面中的方法和属性: 在母版页中调用子页面中的属性和方法有点难度,因为我们无法像上一步中那样通过FindControl来找到方法和属性。 于是我们想到在母版面的声明指示符中加入下面的代码: <%@ Reference Page="~/MasterPage/Show1.aspx" %> 在运行的时候回发现有错误,错误的内容是“无法实现循环引用”。这是因为默认在子页面中引用了母版页,你也就不能再在母版页中引用子页面了。 我在网上也没找到更好的解决方法,但这使我们想起C#是的“反射”,它可以使我们动态获取页面对象,并且可以调用它的属性和方法。 代码如下: Type t = this.ContentPlaceHolder1.Page.GetType(); PropertyInfo pi = t.GetProperty("ContentValue"); //获取ContentValue属性 pi.SetValue(this.ContentPlaceHolder1.Page,this.txtMaster.Text,null); //给属性赋值 MethodInfo mi = t.GetMethod("SetValue"); //获取SetValue()方法 object[] os = new object[1]; //建造输入参数 os[0] = txtMaster.Text; mi.Invoke(this.ContentPlaceHolder1.Page, os); //调用SetValue方法 七、在有多个内容页面使用母版面的情况下,在母版页中根据不同的内容页面实现不同的操作 在母版页中可以加入多个不同的内容页面,但在设计期间,我们无法知道当前运行的是哪个内容页面。所以只能通过分支判断当前运行的是哪个子页面,来执行不同的操作。这里也用到了反射的知识。 代码如下: string s = this.ContentPlaceHolder1.Page.GetType().ToString(); //取出内容页面的类型名称 if (s == "ASP.default17_aspx") //根据不同的内容页面类型执行不同的操作 { ((TextBox)this.ContentPlaceHolder1.FindControl("TextBox2")).Text = "MastPage"; } else if (s == "ASP.default18_aspx") { ((TextBox)this.ContentPlaceHolder1.FindControl("TextBox2")).Text = "Hello MastPage"; }八、在母版面与内容页面中JS代码的操作 在母版页或内容页面中的控件运行之后会自动生成ID,如文本框的ID是txtContent1,在运行之后ID会自动变为ctl00_ContentPlaceHolder2_txtContent1,name属性会变为ctl00$ContentPlaceHolder2$txtContent1。 在JS代码中,我们用document.getElementById()方法,根据id取得控件对象的时候,应当使用ctl00_ContentPlaceHolder2_txtContent1这个ID名,否则会产生“未找到对象”的异常。 示例:在使用了母版页的内容页后,如何在javascript中调用服务器控件值
<script language="javascript" type="text/javascript"> //
"//服务器控件在客户端生成的id txtbox=document.getElementById(v).value; alert(Clientid); alert(txtbox);//文本框的值 } // ]]> </script>
另一篇中的讲解: 在javascript调用控件的时候,无论这个脚本在母版页,还是在子页面: 1。javascript调用客户端控件:都可以直接调用母版页或子页面的所有客户端控件(
)的属性。 即:母版页和子页面里的javascript最终都被加载到了子页面。而客户端控件无论在哪个页面,其id,name等的属性值都不会改变。 2。javascript调用本页面的服务器端控件:都应该使用var d=document.getElementById('<%=TextBox1.ClientID %>');类似的语句。 javascript想调用服务器端控件,注意这个服务器控件的属性变化: 在使用了母版的子页面里,母版里的服务器控件中,runar="server"的Form的属性会变为:
asp.net 母版页使用详解
最新推荐文章于 2024-02-05 09:00:00 发布