惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

GbyAI
GbyAI
J
Java Code Geeks
雷峰网
雷峰网
WordPress大学
WordPress大学
宝玉的分享
宝玉的分享
云风的 BLOG
云风的 BLOG
V
Visual Studio Blog
V
Vulnerabilities – Threatpost
S
Securelist
The Hacker News
The Hacker News
The Register - Security
The Register - Security
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Help Net Security
Help Net Security
G
Google Developers Blog
Hugging Face - Blog
Hugging Face - Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
M
MIT News - Artificial intelligence
AI
AI
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
The GitHub Blog
The GitHub Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Schneier on Security
Schneier on Security
N
Netflix TechBlog - Medium
T
The Blog of Author Tim Ferriss
Google DeepMind News
Google DeepMind News
Hacker News - Newest:
Hacker News - Newest: "LLM"
H
Hacker News: Front Page
博客园 - 司徒正美
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
B
Blog
Microsoft Azure Blog
Microsoft Azure Blog
大猫的无限游戏
大猫的无限游戏
Security Latest
Security Latest
Engineering at Meta
Engineering at Meta
N
News and Events Feed by Topic
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
酷 壳 – CoolShell
酷 壳 – CoolShell
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
T
Threat Research - Cisco Blogs
U
Unit 42
V
V2EX
V2EX - 技术
V2EX - 技术
L
LINUX DO - 最新话题
aimingoo的专栏
aimingoo的专栏
Microsoft Security Blog
Microsoft Security Blog
Recorded Future
Recorded Future
P
Privacy & Cybersecurity Law Blog
美团技术团队
小众软件
小众软件
F
Fortinet All Blogs

博客园 - Shake. Wang's blog

解决sqlserver2005中文版与vs2005的WebApplicationProject的冲突问题 终极解决MagicAjax提交中文表单乱码的问题 Google的使命 - Shake. Wang's blog MagicAjax的中文问题 给web用户控件自定义后台事件 [导入]再谈css--如何针对不同位置的元素使用不同的风格 [导入]当css遇到xhtml--从display:inline到float:left - Shake. Wang's blog [导入][转]台湾鸿海总裁郭台铭给员工的一封邮件,很有借鉴意义 [导入]Unable to get the project ile from the web server错误的解决方法 [导入]ASP.NET 2.0 的内部变化 [导入]VSTS新鲜感触。。。 Blogger 的传说 超女运动终于谢幕了 也说: 谁来重燃开发者的激情 WebApplication的多国语言实现思路 cs第二次整容... 寻找丢失的iexplore进程 伟大架构师的秘密 抗战60周年祭
基于MasterPage和UserControl的网站架构模式
Shake. Wang's blog · 2005-08-23 · via 博客园 - Shake. Wang's blog

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