VS.NET 2005
中提供了ASP.NET 2.0
核心框架,ASP.NET 2.0
改进了以往版本对网页设计方面支持上的不足,新增和增强了很多的功能,其中母版页控件就是一例。
将母版页称为页面模板或许更容易理解它的作用,母版页中包含的是页面公共部分,即网页模板。母版页提供了开发人员已通过传统方式创建的功能,这些传统方式包括重复复制现有代码、文本和控件元素;使用框架集;对通用元素使用包含文件;使用ASP.NET
用户控件等。母版页具有下面的优点:
l
使用母版页可以集中处理页的通用功能,以便可以只在一个位置上进行更新。
l
使用母版页可以方便地创建一组控件和代码,并将结果应用于一组页。例如,可以在母版页上使用控件来创建一个应用于所有页的菜单。
l
通过允许控制占位符控件的呈现方式,母版页使您可以在细节上控制最终页的布局。
l
母版页提供一个对象模型,使用该对象模型可以从各个内容页自定义母版页。
母版页实际由两部分组成,即母版页本身与一个或多个内容页。采用母版页制作的网站都含有两种文件:一种是母版页,一种是内容页。母版页的后缀为.master
,里面封装页面的公共元素;内容页的后缀为.aspx
,就是普通的aspx
页面,里面包含了除母版页外的其他公共内容。在运行时,ASP.NET 2.0
引擎会将两种页面合并再发到客户端的浏览器。
常见的母版页结构如图1-1
所示。
图1-1
母版页结构
从上图所示的效果可以看出,在母版页中包含了两个ContentPlaceHolder
控件,这是母版页上使用的占位控件。如果要想母版页的某一区域可编辑,拖动该控件到该位置即可。但是,需要注意的是母版页中的ContentPlaceHolder
控件的ID
属性必须与内容页中Content
控件的ContentPlaceHolderID
属性绑定。
在Web
项目的【解决方案资源管理器】窗格中右击项目名称选择【添加新项】命令,在弹出的【添加新项】对话框中选择【母版页】项,再单击【确定】按钮添加一个名为MasterPage.master
的母版页到项目中。
切换至【源】视图,我们会发现母版页除了头部声明与普通的aspx
页面不同外,代码结构上与普通的aspx
页面并没有什么差别。
了解了以上预备知识之后,接下来开始使用母版页对系统进行布局。
图1-2
使用母版页的系统
如图1-2
所示为经过设计后母版页中的系统,可以很明显看出包含了一个ContentPlaceHolder
控件,也就是说只有一个区域是可改变的。
由于在母版页中的内容是全局的,因此在图1-2
所示的系统布局可以看到将博客的名称、导航链接和常用功能都固定在母版页中。这其中包含一些需要从数据库中读取来显示的信息,例如,系统中包含的文章数量和评论的数量等。
母版页与普通的ASPX
页面一样,可以在后台文件中编写代码。在本系统中的母版页布局中包含有如下的语句:
<div id="nav_r">
<%=LogCount%>篇文章,<%=CommentCount%>篇评论, 当前日期:<%=DateTime.Now.ToString()%>
</div>
这些数据是要使用数据库的,需要在后台中通过编写代码操作数据库获取结果。双击打开MasterPage.master.cs
文件,引用如下两个数据库所需的命名空间:
using System.Data.Sql;
using System.Data.SqlClient;
先为页面声明两个全局变量,这两个变量的名称与前台布局中的必须相同,然后在页面载入过程Page_Load
添加语句,如下所示:
public string LogCount, CommentCount;
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
getLogCount();//获取日志数量
getCommentCount();//获取评论数量
}
}
其中IsPostBack
是用来判断是第一次浏览该页,还是单击【刷新】按钮载入的页面。如果是第一次则调用getLogCount
方法和getCommentCount
方法。
getLogCount
方法用于获取日志的数量,通过数据库分析得知,这个值需要对info
表进行操作,如下所示为这个方法的代码:
void getLogCount() {
string strsql = "select count(id) as logCount from info";
dbconfig dbconn = new dbconfig();
SqlCommand cmd = new SqlCommand(strsql, dbconn.conn);
SqlDataReader dr = cmd.ExecuteReader();
if (dr.Read()) {
LogCount = dr["logCount"].ToString();
}
dr.Close();
dbconn.Clear();
}
这里是第一次使用数据库类,因此读者要重点掌握数据库类的使用方法。dr.Read()
在有返回值是为true
,往下的语句获取日志数量并赋于全局变量LogCount
值。最后关闭连接,并释放资源。
getCommentCount
方法则用来获取评论的数量,与getLogCount
方法类似,不同的是这里操作的是Comment
评论表,需要将结果保存到CommentCount
变量,代码如下:
void getCommentCount()
{
string strsql = "select count(id) as CommentCount from Comment";
dbconfig dbconn = new dbconfig();
SqlCommand cmd = new SqlCommand(strsql, dbconn.conn);
SqlDataReader dr = cmd.ExecuteReader();
if (dr.Read()) {
CommentCount = dr["CommentCount"].ToString();
}
dr.Close();
dbconn.Clear();
}
图1-2
所示的效果中还有一些同样需要操作数据库,我们将在下面对它们进行逐一介绍。