首先,ContentContainerPlaceHolder继承而来。PlaceHolder是什么,我们看看它的源代码:

public class PlaceHolder : Control

{

      // Methods

      public PlaceHolder();

}

可见PlaceHolder除了继承了WEB.UI.Control,什么也没有做,我们可以将它理解成一个空的Control,大家知道Control之所以能够对页面产生

作用,主要依赖于其Render方法。ContentContainerPlaceHolder继承,单并没有重写Render方法,从客户端的角度来看,它不能对网页产生

任何影响。单作为网页上的控件,它在服务器内存页面布局里面是实实在在存在的,所以,ContentContainer其实是作为容器存在的,它本身

对页面的渲染不起任何效果,单当重写了Render方法的控件被放置到容器中时,它的作用就体现出来了。它帮助将要被放置在其中的控件在页

面上占据了一个位置,使得它的子控件被定位在特定的区域。

 

ContentContainer有一个属性MasterPageFileMasterPageFile指向一个ascx文件,其实就是一个控件。

ContentContainer被初始化时,首先就是加载MasterPageFile控件

ContentContainer中除了放置MasterPageFile控件外,还放置名为Content的控件集合,Content类同样也是一个占位控件。

MasterPageFile控件内部,包含了一个Region控件(也是占位控件)的集合,ContentContainer.MoveContentsIntoRegions方法就是将所有

Content控件放置到各个Region区域,Regions的作用其实就是在MasterPage内部对Contents进行布局。

 

接下来,我们从CCS首页开始来分析Masterpage是如何使用的,

Default.aspx内容如下:

………………………………

      

             

      

该页面包含两个控件,SelectedNavigation控件用于记录当前导航位置,在此不考虑。

可以看到,整个页面就是由一个ContentContainer控件组成,上面我提到该页面加载时会加载对应的Masterpage控件,我们其实就可以将ContentContainer的位置替换成Masterpage的内容,如图示:

 

我们可以将Default.aspx的内容看成上图(Masterpage的内容),不过我们不要忘了ContenContainer还包含下面红色标记的Content子控件:

      

             

      

ContentContainer加载时会调用.MoveContentsIntoRegions方法。蓝色区域是一个Region控件,MoveContentsIntoRegions方法就是将Content变成同名Region控件的子控件。最终的效果就是,Content的内容被替换到Masterpage蓝色标注的区域。

主页面Default.aspx由两个控件组成:Masterpage控件和BodyLayoutTemplate(内容)控件。

 

Masterpage包含了标题栏控件DisplayTitleFooter控件已经一些占位控件。ContentContainer加载Masterpage控件后,再加载BodyLayoutTemplate控件,并将BodyLayoutTemplate控件定位到Masterpage控件预留的占位区域。