Asp.Net母版页的相关知识

来自森大科技官方博客   http://www.cnsendblog.com/index.php/?p=94

母版页的使用与普通页面类似,可以在其中放置文件或者图形、任何的HTML控件和Web控件,后置代码等。母版页的扩展名以.master结尾,不能被浏览器直接查看。母版页必须在被其他页面使用后才能进行显示。

  它的使用跟普通的页面一样,可以可视化的设计,也可以编写后置代码。与普通页面不一样的是,它可以包含ContentPlaceHolder控件,ContentPlaceHolder控件就是可以显示内容页面的区域。

  母版页仅仅是一个页面模板,单独的母版页是不能被用户所访问的。单独的内容页也不能够使用。母版页和内容页有着严格对应关系。母版页中包含多少个ContentPlaceHolder控件,那么内容页中也必须设置与其相对应的Content控件。当客户端浏览器向服务器发出请求,要求浏览某个内容页面时,引擎将同时执行内容页和母版页的代码,并将最终结果发送给客户端浏览器。

  母版页具有下面的优点:

  — 使用母版页可以集中处理页的通用功能,以便可以只在一个位置上进行更新。

  — 使用母版页可以方便地创建一组控件和代码,并将结果应用于一组页。例如,可以在母版页上使用控件来创建一个应用于所有页的菜单。

  — 通过允许控制占位符控件的呈现方式,母版页使您可以在细节上控制最终页的布局。

  — 母版页提供一个对象模型,使用该对象模型可以从各个内容页自定义母版页。

  示例代码:

  <%@ 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>

  ......

  注意:

  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>

  注意:

  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)呈现得到结果页。

  母版页和内容页事件顺序

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

原文地址:https://www.cnblogs.com/cnsend/p/9902510.html

时间: 2024-10-17 06:53:13

Asp.Net母版页的相关知识的相关文章

关于HttpHandler的相关知识总结

一.关于IHttpHandler.IsReusable 很多人不明白,这哥们到底干嘛的,估计是微软最初的一个想法--让一个对象可以一直不断地被重复使用 ,但这个想法不成熟,会带来很多隐藏问题,一个对象作为始终存在的对象,只要被污染了,它就不能正常使用了. 所以,我们会看见微软自己也一直让这个属性值为false; 二.关于ashx的Handler执行方式 扩展名为ashx的请求是通过SimpleHandlerFactory处理程序工厂完成的,当请求一个ashx扩展名的服务器上资源时,SimpleH

关于IHttpModule的相关知识总结

一.IHttpModule相关概述 using System; namespace System.Web { public interface IHttpModule { // 销毁不再被HttpModule使用的资源 void Dispose(); // 初始化一个Module,为捕获HttpRequest做准备 void Init(HttpApplication context); } } 功能概述:向实现类提供模块初始化和处置事件.它能够截获所有请求,如同windows hook一样.所以

获取母版页的相关内容有两种方法 --全了

获取母版页的相关内容有两种方法 1 通过findcontrol找控件ID需要在此事件中~因为Page_load中时是先内容页加载然后才是母版页加载    protected void Page_LoadComplete(object sender, EventArgs e)    {        Label2.Text = "现在时间是" + (Master.FindControl("Label1") as Label).Text;        if (Requ

HTML入门基础教程相关知识

HTML入门基础教程 html是什么,什么是html通俗解答: html是hypertext markup language的缩写,即超文本标记语言.html是用于创建可从一个平台移植到另一平台的超文本文档的一种简单标记语言,经常用来创建web页面.html文件是带有格式标识符和超文本链接的内嵌代码的ascii 文本文件——html结构了解. html文本是由 html命令组成的描述性文本,html 命令可以说明文字. 图形.动画.声音.表格.链接等. html网页结构包括头部 (head).主

python的list相关知识

关于list的相关知识 list01 = ['alex',12,65,'xiaodong',100,'chen',5] list02 = [67,7,'jinjiao_dawang','relax1949',53] #打印list01.list02 print(list01) print(list02) #列表截取.切片 print(list01[1]) print(list01[-2]) print(list01[1:3]) #列表重复 print(list01 * 3) #列表组合 prin

三层交换机相关知识

三层交换机相关知识 这次的作死之路又要开始了.这次的对象主要是交换机:还是三层的: 这是这次实验的总体用图: 现在现根据图上的标志:将所有的主机配置好:目前没有做任何vlan:所以PC1和PC3是能够互通的: 接下来:我想先去探索下三层交换机关闭portswitch会怎么样: 第一步:先关闭了再说: 因为按照图中的设计:PC1的帧如果想要到达PC2,那么就必然要经过LSW1.但是现在我关闭了g0/0/1端口的portswitch:现在pc1并不能ping通pc2: 通过百度:三层交换机的端口不仅

php学习day7--函数的相关知识

今天我们主要学了函数的相关知识,是个比较基础的知识,但也是很重要的. 一.函数 函数就类似于一个工具,我们写好函数之后可以直接进行调用,可以很大的减少代码的从用性,提高页面性能和可读性. 1.函数的定义 在php中函数的定义方式为: function  name($形参1,$形参2.....){ 要执行的代码 return  123: } 在上方的函数定义式中,name代表函数名,小括号内是形参,是用来传递参数,花括号中的就是调用时需要执行的代码. 函数的调用方式: name(实参1,实参2,.

svn常规操作与相关知识

Svn常规操作与相关知识 一.何谓版本控制 它是一种软件工程籍以在开发的过程中,确保由不同人所编辑的同一档案都得到更新,它透过文档控制记录程序各个模块的改动,并为每次改动编上序号,并且编辑错误之后还可以回溯到以前的版本 二.可供我们选择的版本控制系统 1.VCS  (本地版本控制) 2.VSS.CVS(集中版本控制) 3.ClearCase.SVN.Perforce.TFS(集中版本控制) 4.Mercurial(水银/水星).Git(分布式版本控制) 差异: 1.Git和其他版本控制系统的主要

黑马程序员---Objective-C基础学习---类、对象、方法相关知识笔记

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 类.对象.方法相关知识笔记 Objective-C相对于C语言有了面向对象的特性,但是ObjC又没有其他面向对象语言那么多语法特性,ObjC本身对面向对象进行了精简.下面是一些相关知识笔记. 类定义 成员变量 方法和属性 self关键字 类定义 在C#.Java等其他高级语言中定义一个类是相当简单点的,直接一个关键字class加一对大括号基本就完成了,但是在ObjC中类的定义相对变化比较大.现