作者:纯朴的狗熊 出处:博客堂
我很少看到有关介绍ASP.NET页模板(Page Template,以下都称为Page Template)的中文资料,在外国站点上倒是看到过不少这方面资料,不知道是不是大家都不大习惯使用Page Template。我在开发ASP.NET WEB应用程序时,比较喜欢用它,而且效果也不错。今天翻译编著部分资料并整理了下,谈谈ASP.NET Page Templates吧。
当你正在开发的一个web站点的部分或所有页面具有一定共同元素,如banner、版权声明、导航栏等;甚至是部分或所有页面都具有的功能,如身份验证session判断、出错捕捉显示、数据操作及帮助提示功能等时,就会遇到这么一个问题:怎样让这些asp.net页面简单方便地拥有这些共同的元素和功能呢?
在以前ASP编程中,使用include包含文件来解决上面问题。Include文件虽然一定程度上解决了共享页面元素问题,但被包含文件与包含页面之间是紧耦合关系,这也就意味着你的页面必须包含并按一定顺序包含相应的头文件,否则程序将不能正常运行。同时,这种紧耦合关系,使得你在日后为了修改站点某一个显著界面或重要功能时,你将不得不修改每个头文件及每个ASP页面。
现在,在ASP.NET中,利用ASP.NET新增的许多功能特性和面向对象我们完全可以找到更好的解决方法来解决这个问题。
因此,下面主要讨论的将是:ASP.NET有哪些途径可以解决页面元素或功能的共用问题?ASP.NET Page Template能带给我们什么效果?
一、 ASP.NET有哪些途径可以解决页面元素或功能的共用问题?
1、 用户控件(User Controls)
在刚接触ASP.NET时,看过一两本台湾人的书,他们在其中介绍了有关Pagelet(他们称为“网页配件”的东西,感觉比较新鲜。后来才知道,Pagelet的真正名字叫User Control,我们称为用户控件。用户控件其实就是封装了HTML代码块及后部服务器端代码的一个小页面模块,以方便在许多不同的ASP.NET页面里复用它。该部分大家可能也都比较熟悉,就不多说了,更具体可以参http://chs.gotdotnet.com/quickstart/aspplus/doc/webpagelets.aspx。用户控件仍然没有很好解决页面元素和功能共用的问题。比如,你封装了一个Header.ascx以让每个页面头保持一致,随之而来的是你的每个页面都必须拉放Header.ascx在一定位置;当你需要改变Header.ascx位置,将之放在每个页面底下时,你还必须把每个页面一个一个修改过去。
2、 Page Template
在ASP.NET Web应用程序项目里,所有ASPX页都是继承自System.Web.UI.Page类。正因为如此,Page Template方案里,为了解决视图和功能共用问题,我们创建了一个继承自System.Web.UI.Page类的页面基类PageBase,并将Web应用程序中的所有ASPX页面继承自该页面基类PageBase。
从上图可以看出,在System.Web.UI.Page和ASPX页后部代码之间增加了一层PageBase,这将有助于我们把一些公用的视图或功能增加到PageBase中,以使所有页面都具有公用特性。下面为PageBase类代码:
using System;
using System.Web.UI;
public class PageBase : System.Web.UI.Page
{
private string _pageTitle;
public string PageTitle
{
get { return _pageTitle; }
set { _pageTitle = value; }
}
protected override void Render(HtmlTextWriter writer)
{
// 首先创建html及body节点
writer.write(@"
<html>
<head>
<title>" + PageTitle + @"</title>
</head>
<body>");
// 其次允许基类呈现ASPX页面中的HTML代码及ASP.NET控件
base.render( writer );
// 最后结束body和html节点
writer.write(@"
</body>
</html>");
}
}
把一aspx页webform1.aspx的html代码只留下<%@ Page ….. %>指令和<form>…</form>节点内的内容。如下:
&l