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