基于MasterPage和UserControl的网站架构模式

添加人:iyond五级(2331分)   添加时间:2007-05-21    阅读次数:1547  收藏此教程

页面与后台代码分离的方式之 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 上的 . 很不错 .

1页 第1上一页1下一页
相关的教程: Community Server
收藏此教程

当前平均分: 0.0(0 次打分)

-5-4-3-2-1012345
评论主题
您的大名
您的评论
验证码 点击换一个验证码
知识库搜索: