我很少看到有关介绍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编程中,使用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。
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>节点内的内容。如下:
<%@ Page language="c#" Codebehind="WebForm1.aspx.cs" AutoEventWireup="false" Inherits="WebApplication3.WebForm1" %>
<form id="Form1" method="post" runat="server">
This is a Test.
</form>
|
在WebForm1.aspx.cs里:
public
class WebForm1 : PageBase
{
private void Page_Load(object sender, System.EventArgs e)
{
//
在此处放置用户代码以初始化页面
PageTitle = "This is a Test";
}
}
|
至此,一个简单的Page Template已经实现,运行看看,感觉怎样?
J
二、 更多的Page Template应用
我们在做WEB应用时,经常发现WEB应用里的所有的页面都具备部分相同的表现或功能,例如Session处理、页面错误处理等。这些所有页面都相同的表现或功能,我们就可以通过Page Template技术解决,一来方便程序的整理及维护,二来减少代码量。下面列举了大部分WEB应用都具备的一些共性,这些共性可以通过Page Template技术轻松实现:
? ●Session处理
通常,我们需要记录用户的一些信息,如用户名、用户编号等,然后页面程序通过取得这些用户信息进一步判断用户是否已经登录、或进一步取得用户详细资料等。
[思路]:利用Page Template,只需要在所有页基类里定义一个是否已经登录的属性、或设置一个判断是否登录的保护方法,即可在每个页面自动判断用户是否已经登录,如果未登录立即跳转到登录页。
? ●国际化
对于一个需要多国语言显示的WEB应用时,需要在每个页面读取资源文件,以使页面以各种语言显示出来。
[思路]:根据获取到的用户客户端的使用语言,利用CultureInfo类进行操作。然后根据一个关键字key去获取在资源文件里的相应语言正文信息。
CultureInfo cultureObject = CultureInfo.CreateSpecificCulture(langCode);
Thread.CurrentThread.CurrentUICulture = cultureObject;
Thread.CurrentThread.CurrentCulture = cultureObject;
? ●错误处理
可以定义所有页面处理错误的方式的一致性——记录错误->跳转到错误页->以适当提示信息显示错误。
[思路]:利用Page Template,可以在页基类里定义一个ErrorCode属性,接着增加一个SetErrorCode(int code)方法实现设置ErrorCode属性和跳转到错误页面功能(SetErrorCode在后部代码的catch块里调用)。当跳转到错误页面时,错误页面将取得ErrorCode:
int errorCode = ((PageTemplate)Context.Handler).ErrorCode;
然后错误页面就可以根据errorCode从资源文件里取到相应的错误信息并显示出来。
? ●通用工具方法
所有页面都需要进行一些实用的方法,例如记录操作日志、发送信息操作等。
? ●帮助系统
当用户点击页面帮助按钮时,提供一致的帮助显示方式——打开帮助窗口->显示帮助->跳转到当前页所对应的帮助信息页。
[思路]:在页基类里定义HelpURL属性,然后在Render()里使用该属性。
? ●其他
诸如数据库操作、页面样式定制、甚至是所有页面都具有的按钮、图片样式或功能定制都可以使用Page Template实现。当然,具体还得根据具体情况应用。
我们在做WEB应用时,经常发现WEB应用里的所有的页面都具备部分相同的表现或功能,例如Session处理、页面错误处理等。这些所有页面都相同的表现或功能,我们就可以通过Page Template技术解决,一来方便程序的整理及维护,二来减少代码量。下面列举了大部分WEB应用都具备的一些共性,这些共性可以通过Page Template技术轻松实现:
? ●Session处理
通常,我们需要记录用户的一些信息,如用户名、用户编号等,然后页面程序通过取得这些用户信息进一步判断用户是否已经登录、或进一步取得用户详细资料等。
[思路]:利用Page Template,只需要在所有页基类里定义一个是否已经登录的属性、或设置一个判断是否登录的保护方法,即可在每个页面自动判断用户是否已经登录,如果未登录立即跳转到登录页。
? ●国际化
对于一个需要多国语言显示的WEB应用时,需要在每个页面读取资源文件,以使页面以各种语言显示出来。
[思路]:根据获取到的用户客户端的使用语言,利用CultureInfo类进行操作。然后根据一个关键字key去获取在资源文件里的相应语言正文信息。
CultureInfo cultureObject = CultureInfo.CreateSpecificCulture(langCode);
Thread.CurrentThread.CurrentUICulture = cultureObject;
Thread.CurrentThread.CurrentCulture = cultureObject;
? ●错误处理
可以定义所有页面处理错误的方式的一致性——记录错误->跳转到错误页->以适当提示信息显示错误。
[思路]:利用Page Template,可以在页基类里定义一个ErrorCode属性,接着增加一个SetErrorCode(int code)方法实现设置ErrorCode属性和跳转到错误页面功能(SetErrorCode在后部代码的catch块里调用)。当跳转到错误页面时,错误页面将取得ErrorCode:
int errorCode = ((PageTemplate)Context.Handler).ErrorCode;
然后错误页面就可以根据errorCode从资源文件里取到相应的错误信息并显示出来。
? ●通用工具方法
所有页面都需要进行一些实用的方法,例如记录操作日志、发送信息操作等。
? ●帮助系统
当用户点击页面帮助按钮时,提供一致的帮助显示方式——打开帮助窗口->显示帮助->跳转到当前页所对应的帮助信息页。
[思路]:在页基类里定义HelpURL属性,然后在Render()里使用该属性。
? ●其他
诸如数据库操作、页面样式定制、甚至是所有页面都具有的按钮、图片样式或功能定制都可以使用Page Template实现。当然,具体还得根据具体情况应用。
三、 更多Page Template基类
通常,我们一个WEB应用都会由拥有不同模板基类的不同模块组成,例如论坛、后台管理、新闻发布、网上商店等。我们可以利用Page Template技术进一步整理为:
通常,我们一个WEB应用都会由拥有不同模板基类的不同模块组成,例如论坛、后台管理、新闻发布、网上商店等。我们可以利用Page Template技术进一步整理为:
四、 什么时候应该使用Page Template?
最后,我希望大家都能明白,任何一样技术都不会在任何地方适用及使用的。因此,对于Page Template的适用范围为:在不止一个页面(一般是很多页面)的WEB应用里,每个页面都包含诸如headers、footers、menus、session等,甚至是诸如获取登录的用户信息等公用的方法时。
好了。如果需要更为详细的信息或需要下载示例代码,可以参考一下资料:
最后,我希望大家都能明白,任何一样技术都不会在任何地方适用及使用的。因此,对于Page Template的适用范围为:在不止一个页面(一般是很多页面)的WEB应用里,每个页面都包含诸如headers、footers、menus、session等,甚至是诸如获取登录的用户信息等公用的方法时。
好了。如果需要更为详细的信息或需要下载示例代码,可以参考一下资料:
- http://www.codeproject.com/aspnet/pagetemplates.asp
- http://www.codeproject.com/aspnet/page_templates.asp
- http://aspalliance.com/mamanze/articles/?path=pagetemplate3
- http://www.aspnetui.com/templates/
- http://asp.net/Forums/ShowPost.aspx?tabindex=1&PostID=4692
- http://www.wilsondotnet.com/Demos/Generator.aspx
- http://www.devhawk.net/projects/PageLayoutCtl.aspx