首先,ContentContainer从PlaceHolder继承而来。PlaceHolder是什么,我们看看它的源代码:
public class PlaceHolder : Control
{
// Methods
public PlaceHolder();
}
可见PlaceHolder除了继承了WEB.UI.Control,什么也没有做,我们可以将它理解成一个空的Control,大家知道Control之所以能够对页面产生
作用,主要依赖于其Render方法。ContentContainer从PlaceHolder继承,单并没有重写Render方法,从客户端的角度来看,它不能对网页产生
任何影响。单作为网页上的控件,它在服务器内存页面布局里面是实实在在存在的,所以,ContentContainer其实是作为容器存在的,它本身
对页面的渲染不起任何效果,单当重写了Render方法的控件被放置到容器中时,它的作用就体现出来了。它帮助将要被放置在其中的控件在页
面上占据了一个位置,使得它的子控件被定位在特定的区域。
ContentContainer有一个属性MasterPageFile,MasterPageFile指向一个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包含了标题栏控件DisplayTitle和Footer控件已经一些占位控件。ContentContainer加载Masterpage控件后,再加载BodyLayoutTemplate控件,并将BodyLayoutTemplate控件定位到Masterpage控件预留的占位区域。