MasterPage:
优点:
当单继承时有设计时支持与asp.net2.0结合紧密。
缺点:
a.仅为页面设计,不支持控件
b.支持多重继承但,不支持隔代替换
c.不支持ContentPlaceHolder嵌套
Keyss.MasterControls:
优点:
a.同时为页面和控件设计
b.支持多重继承,支持页面母版的隔代替换
c.同时支持页面母版和控件母版的ContentPlaceHolder嵌套(替换子ContentPlaceHolder时规则为广度优先)
缺点:
无设计时支持
下面针对上面提到的mastercontrol的优点作些解释:
a.Keyss.MasterControls同时支持页面和控件母版。
支持页面母板和MasterPage是一样的,如下面两张图一个是首页,一个是内容页,他们的页头,主菜单,页尾以及网站导航区是完全一样的。
因此我为他们共同定义了一个页面模板。如下所示:
然后针对不同的页面我只要用不同的东西替换掉页面中的内容即可。
而在上两张图中右下角(主页的常见问题解答,下载中心及销售网络和内容页的联系管理员)我也用了mastercontrol来生成深红条的panel模版。如下所示:
但针对复杂的html代码,其同样适用。
b.支持多重继承,支持页面的隔代替换
如上面提到的页面母版中,我重写了asp.net2.0中的ContentPlaceHolder使其支持IsGlobal属性,该属性用来表明,此占位符在一个请求上下文中是全局的并且ID也是唯一的,这也就意味着无论我从母板继承了多少代,都可以定位并替换此占位符。举个例子,我所有的栏目页都是从下面这个模板继承来的
但真正的栏目页不可能是千篇一律的,比方说,在登录的时候右下角要显示登录帮助,而在关于我们的右下角要显示联系管理员,这个contentplaceholder是在pagemaster中定义的,在pagearticlecategory中我并没有替换这个contentplaceholder,这些是在最终的页面中替换的。因为我在当前请求的上下文中全局注册了这个contentplaceholder控件所以实现了隔代继承,由于是全局的所以通常IsGlobal仅用在页面母版的占位符中。
c.支持ContentPlaceHolder嵌套
之所以支持ContentPlaceHolder嵌套是为了尽量减少系统中母版的数量,如上面的PageMaster中的以下代码:
这样定义模板时,我只要定义一个模板,只要在替换时三栏替换cphContent和cphHelp而两栏替换cphMain就可以了。
下面是masterControl动态链接库,个人用户可以免费无限制使用。
/Files/keyss/Keyss.MasterControl.rar,另外你也可以到我的个人网站上体验上面的示例。