http://www.cnblogs.com/_zjl/archive/2011/06/12/2078992.html

母版页是VS2005中新引入的一个概念,它很好地实现界面设计的模块化,并且实现实现了代码的重用。它就像婚纱影楼中的婚纱模板,同一个婚纱模板可以给不同的新人用,只要把他们的照片贴在已有的婚纱模板就可以形成一张漂亮的婚纱照片,这样可以大大简化婚纱艺术照的设计复杂度。这里的母版页就像婚纱模板,而内容页面就像两位新人的照片。
在VS2003中没有母版页,要实现这种设计重用的效果,我们只能用“用户控件”来实现,但用户控件没有一种可视化的组合外观,使用起来不太方便。

母版页(扩展名是.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>
......

图片路径:http://hiphotos.baidu.com/mengling99/pic/item/12f2fc3d9ed40aeb9e3d6227.jpg

注意:
    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.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名,否则会产生“未找到对象”的异常。
   (车延禄)
母版页运行机制
       母版页仅仅是一个页面模板,单独的母版页是不能被用户所访问的。单独的内容页也不能够使用。母版页和内容页有着严格对应关系。母版页中包含多少个ContentPlaceHolder控件,那么内容页中也必须设置与其相对应的Content控件。当客户端浏览器向服务器发出请求,要求浏览某个内容页面时,ASP.NET引擎将同时执行内容页和母版页的代码,并将最终结果发送给客户端浏览器。

母版页和内容页的运行过程可以概括为以下5个步骤。

   (1)用户通过键入内容页的URL来请求某页。
   (2)获取内容页后,读取@ Page指令。如果该指令引用一个母版页,则也读取该母版页。如果是第一次请求这两个页,则两个页都要进行编译。
   (3)母版页合并到内容页的控件树中。
   (4)各个Content控件的内容合并到母版页中相应的ContentPlaceHolder控件中。
   (5)呈现得到结果页。

母版页和内容页事件顺序

 

图片路径:http://hiphotos.baidu.com/mengling99/pic/item/a4b8984bcd0d42dc83025c21.jpg

 

(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事件。

使用母版页的优点:
    (1)有利于站点修改和维护,降低开发人员的工作强度
    (2)有利于实现页面布局
    (3)提供一种便于利用的对象模型

asp.net 母版页使用详解--转的更多相关文章

  1. asp.net 母版页使用详解

    母版页是VS2005中新引入的一个概念,它很好地实现界面设计的模块化,并且实现实现了代码的重用.它就像婚纱影楼中的婚纱模板,同一个婚纱模板可以给不同的新人用,只要把他们的照片贴在已有的婚纱模板就可以形 ...

  2. ASP.NET 操作Cookie详解 增加,修改,删除

    ASP.NET 操作Cookie详解 增加,修改,删除 Cookie,有时也用其复数形式Cookies,指某些网站为了辨别用户身份而储存在用户本地终端上的数据(通常经过加密).定义于RFC2109.它 ...

  3. ASP.NET 运行时详解 揭开请求过程神秘面纱

    对于ASP.NET开发,排在前五的话题离不开请求生命周期.像什么Cache.身份认证.Role管理.Routing映射,微软到底在请求过程中干了哪些隐秘的事,现在是时候揭晓了.抛开乌云见晴天,接下来就 ...

  4. ASP.NET运行时详解 集成模式和经典模式

    遗留问题 在<ASP.NET运行时详解 生命周期入口分析>中遗留两个问题,包括Application的InitInternal方法执行细节.IIS6和II7经典模式请求管道管理类Appli ...

  5. ASP.NET生命周期详解

    最近一直在学习ASP.NET MVC的生命周期,发现ASP.NET MVC是建立在ASP.NET Framework基础之上的,所以原来对于ASP.NET WebForm中的很多处理流程,如管道事件等 ...

  6. ASP.NET生命周期详解 [转]

    最近一直在学习ASP.NET MVC的生命周期,发现ASP.NET MVC是建立在ASP.NET Framework基础之上的,所以原来对于ASP.NET WebForm中的很多处理流程,如管道事件等 ...

  7. ASP.NET生命周期详解(转)

    看到好文章需要分享. 最近一直在学习ASP.NET MVC的生命周期,发现ASP.NET MVC是建立在ASP.NET Framework基础之上的,所以原来对于ASP.NET WebForm中的很多 ...

  8. 如何利用IIS调试ASP.NET网站程序详解

    如何利用IIS调试ASP.NET网站程序详解 更新时间:2019年01月13日 08:44:13   作者:江湖逍遥    我要评论   这篇文章主要给大家介绍了关于如何利用IIS调试ASP.NET网 ...

  9. asp.net MVC ViewData详解

    转自:http://www.cnblogs.com/gaopin/archive/2012/11/13/2767515.html 控制器向视图中传值ViewData详解 1.将一个字符串传值到视图中 ...

随机推荐

  1. OC1_类方法的内存管理

    // // Dog.h // OC1_类方法的内存管理 // // Created by zhangxueming on 15/6/19. // Copyright (c) 2015年 zhangxu ...

  2. jQuery中的getter和setter方法

    1.attr()方法是jQuery中用于HTML属性的getter/setter.一个相关函数是removeAttr(). 2.css()方法和attr()方法很类似,只是css()方法作用于元素的c ...

  3. ATL一:CWindowImpl

    1,#ifdef _ATL_DISABLE_NO_VTABLE#define ATL_NO_VTABLE#else#define ATL_NO_VTABLE __declspec(novtable)# ...

  4. C/C++笔试题目

    1. C语言中无符号数与有符号数 unsigned ; ; printf( printf( ? 有符号数和无符号数在进行比较运算时(==,>=,<=,>,<),有符号数隐式的转 ...

  5. iOS进阶——App生命周期

    State Description Not running The app has not been launched or was running but was terminated by the ...

  6. 阿里云 centos 环境配置与 django 部署

    1. 免密码登陆 # 本机生成密钥, 并将 pub 复制到阿里云服务器上 $ ssh-keygen -t rsa -P '' # -P表示密码,-P '' 就表示空密码 $ scp ~/.ssh/FI ...

  7. Adobe Dreamweaver CS6 序列号 注册码(转自91zcm)

    Adobe Dreamweaver CS6  序列号 注册码: 1192-1632-4987-2281-1039-4334 1192-1697-0848-9963-2161-72481192-1871 ...

  8. 《编写高质量代码-Web前端开发修改之道》笔记--第一章 从网站重构说起

    本章内容: 糟糕的页面实现,头疼的维护工作 Web标准--结构.样式和行为的分离 前端的现状 打造高品质的前端代码,提高代码的可维护性--精简.重用.有序 糟糕的页面实现,头疼的维护工作 工作中最大的 ...

  9. 如何解决NTLDR is missing

    问题:ntldr文件不见了,无法进入系统.本系统win XP 简体中文32位 解决步骤: (1)我找来一张win XP 英文版 32位的系统光盘(用U盘驱动也行) (2)重新启动计算机,并进入CMOS ...

  10. 安卓项目中使用JSON引发的一个小错误 Multiple dex files define Lorg/apache/commons/collections/Buffer

    原因: 这里添加的jar包和android自带的jar产生了冲突