页面与后台代码分离的方式之CS模式 一文中, 我已经提到了 Metabuilders 开发的一个masterpage控件,用来整合和控制站点的统一风格显示. 最近再仔细研究一下这个东东,发现还是有很多好处的,就拿来介绍一下了:) (:本文所出现的代码均为community server项目的代码)

自从asp.net问世以来,大部分常见的web项目都是直接使用codebehind方式来建立,这样虽然写起代码来很方便,可以直接使用ide的功能,双击按钮就可以处理后台事件. 但它的缺点也是显而易见的.
1.
它几乎不能实现换肤功能.
2.
重用性太低,相同的页面元素在每个页面里面都会被重复写入.虽然可以部分地使用ascx,但还是不能解决根本问题.
3.
代码冗余,特别是html代码冗余.每添加一个页面都会重复的写 head,body...
4.
风格极度的不易统一,尤其是在协作开发时,任何一个开发人员都可以随意的修改页面里的布局.
... ...

那么,我们来换一种思维想一下,如果开发一个web项目(主要是网站性质的),我们每个开发人员仅仅需要将自己所做的功能模块按照规定的要求写成一个个的control,而不是page,不需要管这些控件怎么去组织,然后,由专门的架构人员将这些control给组织起来,就构成了一个可以运行的实际项目.

当然,这里说的写control也不是那种直接双击按钮就直接在ascx.cs文件中写代码的那种. 而是要代码和界面彻底的分离. 就是说,理论上,在程序集不变的情况下,我可以随意的替换不同风格的界面.而且可以很方便的互相组合control元素. 使之具有不同的布局.

当然这个架构过程会相对复杂一点,我这里只是去繁就简,假设一个站点就一种布局风格, 说一下原理和思路.

1.定义一个masterpage,在这个page里定义各个显示区域. 先看看代码:

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">   
        <CS:region id="MetaRegion" runat="server" ></CS:region>
        <CS:region id="TitleRegion" runat="server" ><CS:Title runat="server"/></CS:region>        
        <CS:region id = "ScriptRegion" runat = "Server">
            <CS:Script id = "Script1" runat = "server" />
        </CS:region>
    </head>
    <body>
        <div id="csContent">
            <CS:Form runat="server" enctype="multipart/form-data">
                <CS:region id="BodyHeaderRegion" runat="server" >
                    <CS:DisplayTitle  runat="server"  ID="Displaytitle1"/>
                </CS:region>
                <CS:region id="BodyFooterRegion" runat="server" >
                    <CS:Footer runat="server" ID="Footer1"/>
                </CS:region>
            </CS:Form>
        </div>
    </body>
</html>

可以看到,这是一个模板页,里面仅仅定义了各个区域.

2.写普通页面,不需要写任何标准html标签,只要注明区域ID,然后,将写好的control放置到该区域内.

<CS:ContentContainer runat="server" id="MPContainer">
    <CS:Content id="BodyContentRegion" runat="server">
        <CSH:BodyLayoutTemplate runat="server"/>
    </CS:Content>
</CS:ContentContainer>

只需要这两步即可实现页面的显示,如果变换风格,也只需要换一下模板页即可.

那么,masterpage是怎么实现将控件加载到指定位置的? 首先, 在任何普通页面加载前,都会先加载模板页里的内容,加载完毕后,再加载模板页里定义的各个区域,然后将各个区域动态定位到指定位置,然后加载区域里controls.

这样以来, 一旦项目的风格确定后, 开发人员仅仅需要关注怎么样去写各个control的逻辑,而不用再考虑页面布局问题. 另外, 又由于每个controls都是做到了代码和界面的彻底分离. 那么,整个web工程就可以没有任何cs代码, 而是将全部的cs代码写在另外一个业务逻辑工程里去.

,今天就先写到这, 有关Masterpage的概念和使用可以参阅如下几篇文章, 这里就不再详细解说了, asp.net2.0,Masterpage已经被正式/官方的支持 :)

Master Pages in ASP.NET 2.0 : 该文详细讲解了在asp.net2.0中如何使用masterpage.

MasterPages Templating Framework : 如果你是在asp.net1.1环境下, 可以使用Matebuilders.com开发的这个. cs就是采用它的控件.该控件也是在微软的几个员工开发的基础上做了修改和完善.

An Extensible Master-Page Framework for ASP.NET 1.1 Using Pattern Oriented Design : codeproject上的.很不错.

posted on 2005-08-23 22:43  Shake. Wang's blog  阅读(1024)  评论(1编辑  收藏  举报