日期:2014-05-17  浏览次数:20798 次

转]asp.net 母版页使用详解

http://jcobra.blog.163.com/blog/static/470493200966287962/

?

母版页(扩展名是.master)
它的使用跟普通的页面一样,可以可视化的设计,也可以编写后置代码。与普通页面不一样的是,它可以包含ContentPlaceHolder控件,ContentPlaceHolder控件就是可以显示内容页面的区域。
代码如下:
<%@ Master Language="C#" AutoEventWireup="true" CodeFile="MasterPage.master.cs" Inherits="MasterPage" %>
......
??? <form id="form1" runat="server">
??? <div>
??????? <asp:contentplaceholder id="ContentPlaceHolder1" runat="server">
??????? </asp:contentplaceholder>
??? </div>
??? </form>
......

[转]asp.net 母版页使用详解 - 墨艺 - ~~无言~~

注意:
??? 1、这里的声明指示符是“<%@ Master...%>”
??? 2、其内部包含<asp:contentplaceholder......>控件

内容页(扩展名是.aspx)
在建立内容页面的时候,在“添加新项”对话框中要选中“选择母版页”复选框。这样建立的页面就是内容页面,内容页面在显示的时候会把母版面的内容一起以水印淡化的形式显示出来,而在母版页中的ContentPlaceHolder控件区域会被内容页面中的Content控件替换,程序员可以在这里编写内容页面中的内容。
代码如下:
<%@ Page Language="C#" MasterPageFile="~/MasterPage/MP.master" AutoEventWireup="true" CodeFile="Show1.aspx.cs" Inherits="MasterPage_Show1" Title="Untitled Page" %>
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
</asp:Content>

[转]asp.net 母版页使用详解 - 墨艺 - ~~无言~~

注意:
??? 1、这里的声明指示符中多了一项MasterPageFile="~/MasterPage/MP.master",这一项是在创建内容页面时根据“选择母版页”复选框的选中情况生成的。它指明了该页是内容页面,也指明了该内容页面的母版页是哪个页面。
??? 2、“<asp:Content ......>”就是要在其中显示的内容。

一、在母版页中编写后台代码,访问母版页中的控件:
??? 与普通的aspx页面一样,双击按钮即可编写母版页中的代码
???
二、在内空页面中编写后台代码,访问内容页面中的控件:
??? 与普通的aspx页面一样,双击按钮即可编写母版页中的代码
???
三、在内容页面中编写代码访问母版页中的控件:
??? 在内容页面中有个Master对象,它是MasterPage类型,它代表当前内容页面的母版页。通过这个对象的FindControl方法,我们可以找到母版面中的控件,这样就可以在内容页面中操作母版页中的控件了。
??????? TextBox txt = (TextBox)((MasterPage)Master).FindControl("txtMaster");
??????? txt.Text = this.txtContent1.Text;
?
???????
四、在内容页面中编写代码访问母版页中的属性和方法:
??? 仍可能通过Master对象进行访问,只不过在这里要把Master对象转换成具体的母版页类型,然后再调用母版页中的属性和方不法。
??? 这里要说明的是:母版页中要被内容页面调用的属性和方法必须是Public修改的。否则无法调到。
??????? 假设母版页中有下面的属性和方法:
??????? 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;

???????
五、在母版页中访问内容页面的控件:
??? 在母版页中可以通过在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.